11 ответов:
для людей, которые находят это в Google, мне нужно было искать первый
nстроки из нескольких файлов, но только для печати соответствующих имен файлов. Я использовалgawk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' filenamesThe
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.
выход
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