2012-01-06 5 views

ответ

103

Магия труб;

head -10 log.txt | grep <whatever> 
+4

вы также можете передать произвольный поток в 'head':' someCmd | head -10 ' –

+0

Головка по умолчанию печатает первые 10 строк до стандартного вывода, поэтому это допустимо для 10 строк' head log.txt | grep ' – Zlemini

+0

Есть ли способ сделать это при использовании опции' -l' grep? Я хотел бы перечислить все файлы, у которых первые 5 символов являются «RIFFD». –

6

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

head -n10 filename | grep ... 

head будет выводить первые 10 строк (с помощью опции -n), а затем вы можете трубы, что выход на grep.

+2

Я даже не понял, все решения здесь, используя 'head' использовали' -n 10' ** (включая меня) ** не понимая, что 'head' by ** default ** отображает *** только 10 строк ***. :) –

+0

Oh _goodness_ это правильно ... –

2

Выход head -10 file может быть передан в grep для того, чтобы достичь этого:

head -10 file | grep … 

Использование Perl:

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

Вы можете использовать следующую строку:

head -n 10 /path/to/file | grep [...] 
18

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

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

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

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

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

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

+1

Почему бы не выйти на 10-й? (см. решение sed) – potong

+0

'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' делает. –

29

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

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

The FNR..nextfile прекращает обработку файла один раз 10 линий было видно. //..{} печатает имя файла и перемещается при каждом появлении первого совпадения в заданном файле. Цитирую имена файлов в пользу других программ, используйте

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

Я был одним из тех людей, которые нашли это в Google. Благодаря! – Floris

+0

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

1

Grep -A 10 <Pattern>

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

+1

Хотя это может быть правильно. добавьте больше описания вопроса, чтобы сделать ответ более полным. –

0

head -10 log.txt | grep -A 2 -B 2 pattern_to_search

head -10 log.txt: прочитайте первые 10 строк файла.

-A 2: распечатать две строки перед рисунком.

-B 2: печать двух строк после рисунка.

0

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

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

N.B: Узор в моем случае всегда совпадает с первой строки.

1

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

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

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

(Отредактировано: fencepost ошибка в моем примере чисел, добавил трубу Grep)

Смежные вопросы