Могу ли я grep только первые n строк файла?



У меня очень длинные файлы журнала, можно ли попросить grep искать только первые 10 строк?

1275   11  

11 ответов:

магия труб;

head -10 log.txt | grep <whatever>

для людей, которые находят это в Google, мне нужно было искать первый n строки из нескольких файлов, но только для печати соответствующих имен файлов. Я использовал

 gawk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' filenames

The FNR..nextfile останавливает обработку файла, как только 10 строк были замечены. Элемент //..{} печатает имя файла и движется дальше, когда появляется первое совпадение в данном файле. Чтобы процитировать имена файлов в интересах других программ, используйте

 gawk 'FNR>10 {nextfile} /pattern/ { print "\"" FILENAME "\"" ; nextfile }' filenames

или использовать awk для одного процесса без |:

awk '/your_regexp/ && NR < 11' INPUTFILE

на каждой строке, если your_regexp соответствует, и количество записей (строк) меньше 11, он выполняет действие по умолчанию (которое печатает входную строку).

или использовать sed:

sed -n '/your_regexp/p;10q' INPUTFILE 

проверяет регулярное выражение и печатает строки (-n означает, что не печатайте вход, который в противном случае является значением по умолчанию), и выходит сразу после 10-й строки.

у вас есть несколько вариантов использования программ вместе с grep. Самым простым на мой взгляд является использование head:

head -n10 filename | grep ...

head выведет первые 10 строк (используя -n опция), а затем вы можете передать этот вывод в grep.

grep "pattern" <(head -n 10 filename)

вы можете использовать следующую строку:

head -n 10 /path/to/file | grep [...]

выход head -10 file может быть передан в grep для этого:

head -10 file | grep …

Использование Perl:

perl -ne 'last if $. > 10; print if /pattern/' file

grep-A 10

Это, чтобы захватить шаблон и следующие 10 строк после шаблона. Это будет хорошо работать только для известного шаблона, если у вас нет известного шаблона, используйте предложения "head".

head -10 log.txt / grep-A 2-B 2 pattern_to_search

head -10 log.txt: прочитайте первые 10 строк файла.

- a 2: печать двух строк перед узором.

- B 2: печать двух строк после шаблона.

расширение к ответу Йоахима Исакссона: довольно часто мне нужно что-то из середины длинного файла, например строки 5001 до 5020, в этом случае вы можете комбинировать head С tail:

head -5020 file.txt | tail -20 | grep x

Это получает первые 5020 строк, затем показывает только последние 20 из них, а затем передает все в grep.

(отредактировано: ошибка fencepost в моих примерах номеров, добавлена труба в grep)

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

ls |parallel --gnu 'cat <(echo {}) <(head {})|grep -B1 -m1 -P "^>.*F3$"'

N. B: шаблон в моем случае всегда соответствует первой строке.

Comments

    Ничего не найдено.