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

420

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

Теги:
printing
skip

13 ответов

656
Лучший ответ

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

$ 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. >
  • 44
    Или "tail --lines = + <LinesToSkip> ..." для толпы читаемых команд :-)
  • 15
    в centos 5.6 tail -n +1 показывает весь файл, а tail -n +2 пропускает первую строку. странный. То же самое для tail -c +<num> .
Показать ещё 5 комментариев
85

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

tail -n +1000001 huge-file.log

Это символ +, который делает то, что вы хотите. Процитировать с man-страницы:

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

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

  • 0
    Работает и для хвоста BSD (OS X)
72

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

$ sed 1,10d file.txt
  • 11
    В более общем случае вам придется использовать sed 1,Xd где X - количество удаляемых начальных строк, где X больше 1.
  • 0
    Это имеет больше смысла, если вы не знаете, как долго файл и не хотите, чтобы tail печатал последние 100000000 строк.
23

Менее сложная версия с AWK:

awk 'NR > 1e6' myfile.txt

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

  • 5
    полезно, если вам нужно пропустить несколько строк в середине файла, например, awk '!(5 < NR && NR < 10)'
13

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

Пример:

$ perl -wle 'print for (1..1_000_005)'|sed '1,1000000d'
1000001
1000002
1000003
1000004
1000005
  • 1
    @ Марлон, прости, но это не так. Это работает только для 1d. Если, например, вы используете его на 2d, вы удалите только строку 2. Он не удалит диапазон строк.
  • 0
    @ABB извините, хотел сказать, что это было самое простое решение, поэтому я +1 не пытался исправить автора.
12

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

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

  • 2
    Это несколько вводит в заблуждение, потому что кто-то может интерпретировать (x+1) буквально. Например, для x = 2 они могут вводить либо (2+1) либо даже (3) , ни один из которых не будет работать. Лучший способ написать это может быть: Чтобы пропустить первые X строк, с Y = X + 1, используйте tail -n +Y <filename>
12

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

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

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

sed -n '20,30 p' myFile.txt
10

Эта оболочка 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

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

  • 1
    ++ для использования awk, который немного более переносим, чем tail
8

Используйте команду 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.

  • 1
    Наиболее удобный для использования ответ как для клиентов, так и для сценариев.
5

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

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

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

  • 3
    Не самый эффективный ответ, так как вам нужно сделать «wc -l» для файла, чтобы получить количество строк, а затем добавить миллион :-). Вы можете сделать это только с "хвостом".
  • 0
    Я не уверен, я понимаю, что 1e6 будет известно во время вызова. Отсчет назад не самый быстрый, хотя.
3
cat < File > | awk '{if(NR > 6) print $0}'
  • 0
    Это синтаксическая ошибка в bash - в какой оболочке это работает?
  • 0
    Я запускаю это в Bash. <И> не являются частью команды, имя файла должно заменять «<File>»
Показать ещё 1 комментарий
2
sed -n '1d;p'

эта команда удалит первую строку и выведет остальные

-1

Мне нужно было сделать то же самое и найти этот поток.

Я попробовал "tail -n +", но он просто распечатал все.

Чем больше + строк хорошо работало в подсказке, но оказалось, что при работе в режиме безголовки (cronjob) он выглядел совершенно иначе.

Я, наконец, написал это сам:

skip=5
FILE="/tmp/filetoprint"
tail -n$((`cat "${FILE}" | wc -l` - skip)) "${FILE}"
  • 0
    слишком сложно
  • 0
    Правильная ссылка на награду « Бесполезное использование кошек» . Предыдущее заменяется рекламой.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню