Распечатать файл, пропустив первые X строк в Bash - PullRequest
455 голосов
/ 03 марта 2009

У меня есть очень длинный файл, который я хочу напечатать, но пропустив первые 1e6 строк, например. Я заглядываю на страницу справки по кошкам, но не вижу никакой возможности сделать это. Я ищу команду для этого или простую программу bash.

Ответы [ 13 ]

738 голосов
/ 03 марта 2009

Вам понадобится хвост. Некоторые примеры:

$ tail great-big-file.log
< Last 10 lines of great-big-file.log >

Если вам действительно нужно пропустить определенное количество «первых» строк, используйте

$ tail -n +<N+1> <filename>
< filename, excluding first N lines. >

То есть, если вы хотите пропустить N строк, вы начинаете печатать строку N + 1. Пример:

$ tail -n +11 /tmp/myfile
< /tmp/myfile, starting at line 11, or skipping the first 10 lines. >

Если вы хотите просто увидеть последние строки, опустите "+":

$ tail -n <N> <filename>
< last N lines of file. >
91 голосов
/ 03 марта 2009

Если в вашей системе доступен GNU tail, вы можете сделать следующее:

tail -n +1000001 huge-file.log

Это персонаж +, который делает то, что вы хотите. Цитировать из справочной страницы:

Если первый символ K (количество байтов или строк) является `+ ', печать начинается с K-го элемента в начале каждого файла.

Таким образом, как отмечено в комментарии, установка +1000001 начинает печать с первого элемента после первых 1 000 000 строк.

89 голосов
/ 17 октября 2012

Я нашел самый простой способ удалить первые десять строк файла:

$ sed 1,10d file.txt
25 голосов
/ 26 апреля 2013

Менее подробная версия с AWK:

awk 'NR > 1e6' myfile.txt

Но я бы порекомендовал использовать целые числа.

13 голосов
/ 09 июля 2013

, если вы хотите пропустить первые две строки
tail -n +3 <filename>

, если вы хотите пропустить первую строку x
tail -n +$((x+1)) <filename>

13 голосов
/ 26 января 2012

Просто предложить альтернативу sed. :) Чтобы пропустить первый миллион строк, попробуйте |sed '1,1000000d'.

Пример:

$ perl -wle 'print for (1..1_000_005)'|sed '1,1000000d'
1000001
1000002
1000003
1000004
1000005
12 голосов
/ 20 декабря 2012

Если вы хотите увидеть первые 10 строк, вы можете использовать sed, как показано ниже:

sed -n '1,10 p' myFile.txt

или, если вы хотите увидеть строки от 20 до 30, вы можете использовать:

sed -n '20,30 p' myFile.txt
10 голосов
/ 02 декабря 2016

Используйте команду sed delete с адресом диапазона . Например:

$ sed 1,100d file.txt # Print file.txt omitting lines 1-100.

Либо, если вы хотите распечатать только известный диапазон, используйте команду печати с флагом -n:

$ sed -n 201,300p file.txt # Print lines 201-300 from file.txt

Это решение должно надежно работать на всех системах UNIX, независимо от наличия утилит GNU.

10 голосов
/ 31 марта 2009

У меня отлично работает этот скрипт:

#!/bin/bash
awk -v initial_line=$1 -v end_line=$2 '{
    if (NR >= initial_line && NR <= end_line) 
    print $0
}' $3

Используется с этим примером файла (file.txt):

one
two
three
four
five
six

Команда (извлекает из файла вторую-четвертую строку):

edu@debian5:~$./script.sh 2 4 file.txt

Вывод этой команды:

two
three
four

Конечно, вы можете улучшить его, например, проверив, что все значения аргументов являются ожидаемыми: -)

5 голосов
/ 03 марта 2009

Вы можете сделать это, используя команды head и tail:

head -n <num> | tail -n <lines to print>

где num равно 1e6 + количество строк, которые вы хотите напечатать.

...