Распечатайте файл, пропуская первые X строк в Bash
Вопрос
У меня есть очень длинный файл, который я хочу распечатать, но пропускаю, например, первые 1e6 строк.Я заглядываю на справочную страницу cat, но не вижу никакой возможности сделать это.Я ищу команду для этого или простую программу 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, вы можете сделать следующее:
tail -n +1000001 huge-file.log
Это тот самый +
персонаж, который делает то, что вы хотите.Цитирую со справочной страницы:
Если первый символ K (количество байтов или строк) равен `+', печатайте, начиная с K-го элемента в начале каждого файла.
Таким образом, как отмечено в комментарии, ввод +1000001 запускает печать с первого элемента после первых 1 000 000 строк.
Самый простой способ, который я нашел, удалить первые десять строк файла:
$ sed 1,10d file.txt
Менее подробная версия с 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
если вы хотите пропустить первые две строки
tail -n +3 <filename>
если вы хотите пропустить первую строку x
tail -n +$((x+1)) <filename>
Если вы хотите увидеть первые 10 строк, вы можете использовать sed, как показано ниже:
sed -n '1,10 p' myFile.txt
или, если вы хотите увидеть строки от 20 до 30, вы можете использовать:
sed -n '20,30 p' myFile.txt
Используйте сэд 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.
Этот сценарий оболочки отлично работает для меня:
#!/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
Конечно, вы можете улучшить его, например, проверив, что все значения аргументов являются ожидаемыми :-)
Вы можете сделать это с помощью команд head и tail:
head -n <num> | tail -n <lines to print>
где num - это 1e6 + количество строк, которые вы хотите напечатать.
sed -n '1d;p'
эта команда удалит первую строку и выведет остальные
cat < File > | awk '{if(NR > 6) print $0}'
Мне нужно было сделать то же самое, и я нашел эту тему.
Я попробовал "tail -n +", но он просто напечатал все.
Строки more + отлично работали в командной строке, но оказалось, что при запуске в безголовом режиме (cronjob) они вели себя совершенно по-другому.
Наконец-то я написал это сам:
skip=5
FILE="/tmp/filetoprint"
tail -n$((`cat "${FILE}" | wc -l` - skip)) "${FILE}"