После просмотра FNR..nextfile10 строк обработка файла прекращается. В //..{}печатает имя файла и перемещается на всякий раз , когда первый матч в данный файл показывает вверх. Чтобы указать имена файлов в кавычках для других программ, используйте
Я был одним из тех, кто нашел это в 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-й строки.
@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.
Я даже не осознавал, что все используемые здесь решения headиспользовали -n 10(включая меня), не осознавая, что headпо умолчанию отображается только 10 строк . :)
Нет, это даст вам первые 6 вхождений слова «string» во всем файле
cov.txt
2
Расширение ответа Йоахима Исакссона: довольно часто мне нужно что-то из середины длинного файла, например строки с 5001 по 5020, и в этом случае вы можете комбинировать headс tail:
head -5020 file.txt | tail -20| grep x
Он получает первые 5020 строк, затем показывает только последние 20 из них, а затем передает все в grep.
(Отредактировано: ошибка ограждения в моих примерах номеров, добавлена труба в grep)
Это для того, чтобы захватить узор и следующие 10 строк после узора. Это будет хорошо работать только для известного шаблона, если у вас нет известного шаблона, используйте предложения «головы».
Хотя может и правильно. добавьте дополнительное описание вопроса, чтобы сделать ответ более исчерпывающим.
Прамод С. Никам
3
Это отвечает на совершенно другой вопрос и в данном контексте бесполезно.
Pre101
-1
У меня была аналогичная проблема, и все вышеуказанные проблемы не решают ее полностью. Меня также интересует получение имени файла, содержащего совпадающие строки. Мое решение:
head
:someCmd | head -10
head log.txt | grep <whatever>
-l
опции grep ? Я хотел бы перечислить все файлы, у которых есть первые 5 символовRIFFD
.Для тех, кто нашел это в Google, мне нужно было искать в первых
n
строках нескольких файлов, но печатать только совпадающие имена файлов. я использовалПосле просмотра
FNR..nextfile
10 строк обработка файла прекращается. В//..{}
печатает имя файла и перемещается на всякий раз , когда первый матч в данный файл показывает вверх. Чтобы указать имена файлов в кавычках для других программ, используйтеисточник
FNR=1
будет искать только 1-ю строку. Спасибо!find ./path -type -f -exec awk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' '{}' +
-type f
Или используйте
awk
для одного процесса без|
:В каждой строке, если она
your_regexp
совпадает, а количество записей (строк) меньше 11, выполняется действие по умолчанию (которое печатает строку ввода).Или используйте
sed
:Проверяет ваше регулярное выражение и печатает строку (
-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
выведет первые 10 строк (используя-n
опцию), а затем вы можете передать этот вывод по конвейеруgrep
.источник
head
использовали-n 10
(включая меня), не осознавая, чтоhead
по умолчанию отображается только 10 строк . :)источник
Вы можете использовать следующую строку:
источник
Вывод
head -10 file
может быть передан по конвейеруgrep
, чтобы выполнить это:Используя Perl:
источник
-A 2
: выведите две строки перед узором.-B 2
: вывести две строчки после шаблона.источник
-C 2
сделаю то же самое, что-A 2 -B 2
Это ищет только первые 6 строк для
string
источник
Расширение ответа Йоахима Исакссона: довольно часто мне нужно что-то из середины длинного файла, например строки с 5001 по 5020, и в этом случае вы можете комбинировать
head
сtail
:Он получает первые 5020 строк, затем показывает только последние 20 из них, а затем передает все в grep.
(Отредактировано: ошибка ограждения в моих примерах номеров, добавлена труба в grep)
источник
grep -A 10 <шаблон>
Это для того, чтобы захватить узор и следующие 10 строк после узора. Это будет хорошо работать только для известного шаблона, если у вас нет известного шаблона, используйте предложения «головы».
источник
У меня была аналогичная проблема, и все вышеуказанные проблемы не решают ее полностью. Меня также интересует получение имени файла, содержащего совпадающие строки. Мое решение:
NB: Шаблон в моем случае всегда соответствует первой строке.
источник