У меня очень длинные файлы журнала, можно ли попросить 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..nextfile10 строк обработка файла прекращается. В //..{}печатает имя файла и перемещается на всякий раз , когда первый матч в данный файл показывает вверх. Чтобы указать имена файлов в кавычках для других программ, используйте
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