Печать файла, пропускающего первые X строк в Bash
У меня очень длинный файл, который я хочу напечатать, но пропускаю первые строки 1e6, например. Я смотрю на страницу cat man, но я не видел никакой возможности сделать это. Я ищу команду для этого или простую программу bash.
13 ответов
вам понадобится хвост.
$ 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. >
Если у вас есть GNU tail, доступный в вашей системе, вы можете сделать следующее:
tail -n +1000001 huge-file.log
Это +
символ, который делает то, что вы хотите. Цитата из man-страницы:
Если первый символ K (количество байтов или строк) равен a '+', печать, начиная с k-го элемента с начала каждого файла.
таким образом, как отмечено в комментарии, putting +1000001 начинает печать с первого элемента после первого 1,000,000 русло.
менее многословная версия с AWK:
awk 'NR > 1e6' myfile.txt
но я бы рекомендовал использовать целые числа.
просто предложить sed
альтернативы. :) Чтобы пропустить первый миллион строк, попробуйте |sed '1,1000000d'
.
пример:
$ perl -wle 'print for (1..1_000_005)'|sed '1,1000000d'
1000001
1000002
1000003
1000004
1000005
Если вы хотите увидеть первую строку 10, вы можете использовать sed, как показано ниже:
sed -n '1,10 p' myFile.txt
или если вы хотите видеть линии от 20 до 30 вы можете использовать:
sed -n '20,30 p' myFile.txt
Если вы хотите пропустить первые две строкиtail -n +3 <filename>
Если вы хотите пропустить первую строку x tail -n +$((x+1)) <filename>
этот скрипт отлично работает для меня:
#!/bin/bash
awk -v initial_line= -v end_line= '{
if (NR >= initial_line && NR <= end_line)
print
}'
используется с этим образцом файла (file.txt):
one
two
three
four
five
six
команда (она будет извлекаться со второй по четвертую строку в файле):
edu@debian5:~$./script.sh 2 4 file.txt
вывод этой команды:
two
three
four
конечно, вы можете улучшить его, например, проверив, что все значения аргументов являются ожидаемыми : -)
использовать sed delete
команда С диапазон адресов. Например:
$ sed 1,100d file.txt # Print file.txt omitting lines 1-100.
кроме того, если вы хотите напечатать только известный диапазон, используйте команду print с -n
флаг:
$ sed -n 201,300p file.txt # Print lines 201-300 from file.txt
это решение должно надежно работать на всех системах UNIX, независимо от наличия утилит GNU.
вы можете сделать это, используя команды head и tail:
head -n <num> | tail -n <lines to print>
где num - 1e6 + количество строк, которые вы хотите напечатать.
Мне нужно было сделать то же самое и найти этот поток.
я попробовал " tail-n +, но он просто напечатал все.
больше + строк хорошо работали в приглашении, но оказалось, что он вел себя совершенно иначе при запуске в безголовом режиме (cronjob).
Я, наконец, написал это сам:
skip=5
FILE="/tmp/filetoprint"
tail -n$((`cat "${FILE}" | wc -l` - skip)) "${FILE}"