Могу ли я grep только первые n строк файла? - PullRequest
106 голосов
/ 06 января 2012

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

Ответы [ 12 ]

147 голосов
/ 06 января 2012

Магия труб;

head -10 log.txt | grep <whatever>
44 голосов
/ 30 октября 2013

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

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

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

 gawk 'FNR>10 {nextfile} /pattern/ { print "\"" FILENAME "\"" ; nextfile }' filenames
23 голосов
/ 06 января 2012

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

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

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

Или используйте sed:

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

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

8 голосов
/ 06 января 2012

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

head -n10 filename | grep ...

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

4 голосов
/ 06 января 2012
grep "pattern" <(head -n 10 filename)
2 голосов
/ 05 июля 2019
grep -m6 "string" cov.txt

Это ищет только первые 6 строк для string

2 голосов
/ 02 июня 2016
head -10 log.txt | grep -A 2 -B 2 pattern_to_search

-A 2: вывести две строки перед рисунком.

-B 2: вывести две строки после шаблона.

head -10 log.txt # read the first 10 lines of the file.
2 голосов
/ 06 января 2012

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

head -n 10 /path/to/file | grep [...]
2 голосов
/ 06 января 2012

Выход head -10 file может быть передан в grep, чтобы выполнить это:

head -10 file | grep …

Используя Perl:

perl -ne 'last if $. > 10; print if /pattern/' file
1 голос
/ 30 сентября 2016

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...