Распечатайте файл, пропуская первые X строк в Bash

StackOverflow https://stackoverflow.com/questions/604864

  •  03-07-2019
  •  | 
  •  

Вопрос

У меня есть очень длинный файл, который я хочу распечатать, но пропускаю, например, первые 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}"
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top