У меня очень длинный файл, который я хочу распечатать, но пропуская первые строки 1e6, например. Я заглядываю в страницу кошачьего мужа, но я не видел возможности этого сделать. Я ищу команду для этого или простую программу bash.
Вам понадобится хвост. Некоторые примеры:
$ 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 -n +1000001 huge-file.log
Это символ +
, который делает то, что вы хотите. Процитировать с man-страницы:
Если первый символ K (количество байтов или строк) является `+ ', начните с элемента Kth с начала каждого файла.
Таким образом, как отмечено в комментарии, добавление +1000001 начинает печать с первого элемента после первых 1 000 000 строк.
Самый простой способ найти первые десять строк файла:
$ sed 1,10d file.txt
sed 1,Xd
где X - количество удаляемых начальных строк, где X больше 1.
tail
печатал последние 100000000 строк.
Менее сложная версия с AWK:
awk 'NR > 1e6' myfile.txt
Но я бы рекомендовал использовать целые числа.
awk '!(5 < NR && NR < 10)'
Просто предложите альтернативу sed
.:) Чтобы пропустить первый миллион строк, попробуйте |sed '1,1000000d'
.
Пример:
$ perl -wle 'print for (1..1_000_005)'|sed '1,1000000d'
1000001
1000002
1000003
1000004
1000005
если вы хотите пропустить первые две строки tail -n +3 <filename>
если вы хотите пропустить первую строку x tail -n +$((x+1)) <filename>
(x+1)
буквально. Например, для x = 2 они могут вводить либо (2+1)
либо даже (3)
, ни один из которых не будет работать. Лучший способ написать это может быть: Чтобы пропустить первые X строк, с Y = X + 1, используйте tail -n +Y <filename>
Если вы хотите увидеть первые 10 строк, вы можете использовать sed, как показано ниже:
sed -n '1,10 p' myFile.txt
или если вы хотите видеть строки от 20 до 30, вы можете использовать:
sed -n '20,30 p' myFile.txt
Эта оболочка script отлично работает для меня:
#!/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
Конечно, вы можете улучшить его, например, тестируя, что все значения аргументов являются ожидаемыми: -)
Используйте команду 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.
Вы можете сделать это, используя команды head и tail:
head -n <num> | tail -n <lines to print>
где num - 1e6 + количество строк, которые вы хотите распечатать.
cat < File > | awk '{if(NR > 6) print $0}'
sed -n '1d;p'
эта команда удалит первую строку и выведет остальные
Мне нужно было сделать то же самое и найти этот поток.
Я попробовал "tail -n +", но он просто распечатал все.
Чем больше + строк хорошо работало в подсказке, но оказалось, что при работе в режиме безголовки (cronjob) он выглядел совершенно иначе.
Я, наконец, написал это сам:
skip=5
FILE="/tmp/filetoprint"
tail -n$((`cat "${FILE}" | wc -l` - skip)) "${FILE}"
tail -n +1
показывает весь файл, аtail -n +2
пропускает первую строку. странный. То же самое дляtail -c +<num>
.