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


Ответы:


175

Магия трубок;

head -10 log.txt | grep <whatever>

13
вы также можете перенаправить произвольный поток на head:someCmd | head -10
Стюарт Нельсон

1
Head по умолчанию выводит первые 10 строк на стандартный вывод, так что это действительно для 10 строкhead log.txt | grep <whatever>
Zlemini

5
Есть ли способ сделать это при использовании -lопции grep ? Я хотел бы перечислить все файлы, у которых есть первые 5 символов RIFFD.
Джеймс М. Лэй

49

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

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

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

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

9
Я был одним из тех, кто нашел это в Google. Спасибо!
Флорис

для меня этот код распечатал полный путь к файлу. Это именно то, что мне нужно. Также FNR=1будет искать только 1-ю строку. Спасибо!
Brian W

2
Для этого рекурсивно через каталог:find ./path -type -f -exec awk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' '{}' +
OrangeDog

1
Спасибо @OrangeDog. Одно небольшое исправление: должно быть-type f
Дэвид Сигал

26

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

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

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

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

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

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


1
Почему бы не бросить 10-го числа? (см. решение sed)
potong 06

awk '{ if ( NR <= 10 ) { if(index($0,"ab") > 0) { print $0; } } else { exit; } }' textfile-- Быстрее.

1
@potong ты прав, поправил. @srikanthradix, хотя это может быть быстрее, ваше решение не ищет регулярные выражения, а только фиксированные строки. awk '{ if ( NR <= 10 ) { if( $0 ~ "YOUR_REGEXP") { print } } else { exit; } }' textfileделает.
Zsolt Botykai

4
Плюс стиль - нет awkish. 2xifsи 1xelseв команде, которая не нуждается в действии, выражение aho. weinberger и kernighan cry ...
джайпал сингх 07

1
Я думаю, что вместо NR было бы лучше использовать FNR, потому что если вы используете awk с несколькими файлами, FNR начинается с 0 для каждого файла.
Владислав Савченко

9

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

head -n10 filename | grep ...

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


6
Я даже не осознавал, что все используемые здесь решения headиспользовали -n 10 (включая меня), не осознавая, что headпо умолчанию отображается только 10 строк . :)
jaypal singh 07



3

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

head -10 file | grep 

Используя Perl:

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

3
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.

1
Если я напомню, -C 2сделаю то же самое, что-A 2 -B 2
Дэвид ЛеБауэр

3
grep -m6 "string" cov.txt

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


3
Нет, это даст вам первые 6 вхождений слова «string» во всем файле
cov.txt

2

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

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

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

(Отредактировано: ошибка ограждения в моих примерах номеров, добавлена ​​труба в grep)


1

grep -A 10 <шаблон>

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


1
Хотя может и правильно. добавьте дополнительное описание вопроса, чтобы сделать ответ более исчерпывающим.
Прамод С. Никам

3
Это отвечает на совершенно другой вопрос и в данном контексте бесполезно.
Pre101

-1

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.