У меня очень длинные файлы журнала, можно ли попросить grep искать только первые 10 строк?
У меня очень длинные файлы журнала, можно ли попросить grep искать только первые 10 строк?
Ответы:
Магия трубок;
head -10 log.txt | grep <whatever>
head log.txt | grep <whatever>
-l
опции grep ? Я хотел бы перечислить все файлы, у которых есть первые 5 символов RIFFD
.
Для тех, кто нашел это в Google, мне нужно было искать в первых n
строках нескольких файлов, но печатать только совпадающие имена файлов. я использовал
gawk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' filenames
После просмотра FNR..nextfile
10 строк обработка файла прекращается. В //..{}
печатает имя файла и перемещается на всякий раз , когда первый матч в данный файл показывает вверх. Чтобы указать имена файлов в кавычках для других программ, используйте
gawk 'FNR>10 {nextfile} /pattern/ { print "\"" FILENAME "\"" ; nextfile }' filenames
FNR=1
будет искать только 1-ю строку. Спасибо!
find ./path -type -f -exec awk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' '{}' +
-type f
Или используйте awk
для одного процесса без |
:
awk '/your_regexp/ && NR < 11' INPUTFILE
В каждой строке, если она your_regexp
совпадает, а количество записей (строк) меньше 11, выполняется действие по умолчанию (которое печатает строку ввода).
Или используйте sed
:
sed -n '/your_regexp/p;10q' INPUTFILE
Проверяет ваше регулярное выражение и печатает строку ( -n
означает не печатать ввод, который в противном случае является значением по умолчанию) и завершает работу сразу после 10-й строки.
awk '{ if ( NR <= 10 ) { if(index($0,"ab") > 0) { print $0; } } else { exit; } }' textfile
-- Быстрее.
awk '{ if ( NR <= 10 ) { if( $0 ~ "YOUR_REGEXP") { print } } else { exit; } }' textfile
делает.
awkish
. 2xifs
и 1xelse
в команде, которая не нуждается в действии, выражение aho. weinberger и kernighan cry ...
У вас есть несколько вариантов использования программ вместе с grep
. Самым простым, на мой взгляд, является использование head
:
head -n10 filename | grep ...
head
выведет первые 10 строк (используя -n
опцию), а затем вы можете передать этот вывод по конвейеру grep
.
head
использовали -n 10
(включая меня), не осознавая, что head
по умолчанию отображается только 10 строк . :)
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
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.
-C 2
сделаю то же самое, что-A 2 -B 2
grep -m6 "string" cov.txt
Это ищет только первые 6 строк для string
Расширение ответа Йоахима Исакссона: довольно часто мне нужно что-то из середины длинного файла, например строки с 5001 по 5020, и в этом случае вы можете комбинировать head
с tail
:
head -5020 file.txt | tail -20 | grep x
Он получает первые 5020 строк, затем показывает только последние 20 из них, а затем передает все в grep.
(Отредактировано: ошибка ограждения в моих примерах номеров, добавлена труба в grep)
grep -A 10 <шаблон>
Это для того, чтобы захватить узор и следующие 10 строк после узора. Это будет хорошо работать только для известного шаблона, если у вас нет известного шаблона, используйте предложения «головы».
У меня была аналогичная проблема, и все вышеуказанные проблемы не решают ее полностью. Меня также интересует получение имени файла, содержащего совпадающие строки. Мое решение:
ls |parallel --gnu 'cat <(echo {}) <(head {})|grep -B1 -m1 -P "^>.*F3$"'
NB: Шаблон в моем случае всегда соответствует первой строке.
head
:someCmd | head -10