Чи можу я зібрати лише перші п рядків файлу?


Відповіді:


175

Магія труб;

head -10 log.txt | grep <whatever>

13
Ви також можете подати довільний потік head:someCmd | head -10
Стюарт Нельсон

1
За замовчуванням друкуються перші 10 рядків до стандартного виводу, тому це дійсно для 10 рядківhead log.txt | grep <whatever>
Zlemini

5
Чи є спосіб це зробити при використанні -lопції grep ? Я хотів би перерахувати всі файли, які є першими 5 символами RIFFD.
Джеймс М. Лежа

49

Людям, які виявили це в Google, мені потрібно було шукати перші nрядки з декількох файлів, але тільки для друку відповідних імен файлів. я використав

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

У FNR..nextfileприпиняє обробку файлу один раз 10 рядків були помічені. У //..{}друкує ім'я файлу і переміщується на всякий раз , коли перший матч в даний файл показує вгору. Для цитування імен файлів на користь інших програм використовуйте

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

9
Я був одним із тих людей, хто знайшов це в Google. Дякую!
Флоріс

для мене цей код роздрукував повний шлях до файлу. Це саме те, що мені було потрібно. Також FNR=1буде просто пошук 1-го рядка. Дякую!
Брайан Ш

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-го рядка.


1
Чому б не відмовитися від 10-го? (див. рішення розчин)
потонг

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робить.
Zsolt Botykai

4
Плюс стиль не є awkish. 2xifsі 1xelseв команді, яка не потребує операції про дію, було б добре. weinberger and kernighan cry ...
jaypal singh

1
Я думаю, замість NR було б краще використовувати FNR, тому що якщо ви використовуєте awk з декількома файлами, FNR починається від 0 для кожного файлу.
Владислав Савченко

9

У вас є кілька варіантів використання програм разом із grep. Найпростіший, на мою думку, використання head:

head -n10 filename | grep ...

headвиведе перші 10 рядків (використовуючи -nпараметр), а потім ви зможете передати цей вихід grep.


6
Я навіть не усвідомлював, що всі використовувані тут рішення headвикористовували -n 10 (включаючи мене), не розуміючи, що headза замовчуванням відображається лише 10 рядків . :)
jaypal singh



3

Для цього head -10 fileможна зробити висновок grep:

head -10 file | grep 

Використання Perl:

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

3
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.

1
Якщо я пам’ятаю, -C 2зробимо те саме, що-A 2 -B 2
Девід Лебоуер

3
grep -m6 "string" cov.txt

Тут шукаються лише перші 6 рядків string


3
Ні, це дасть вам перші 6 випадків "рядка" у всьому файлі
cov.txt

2

Розширення до відповіді Йоахіма Ісакссона: Досить часто мені потрібно щось із середини довгого файлу, наприклад, рядки 5001 до 5020, у цьому випадку ви можете комбінувати headз tail:

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

Це отримує перші 5020 рядків, потім показує лише останні 20 з них, потім передає все, щоб схопитися.

(Відредаговано: помилка огорожі в моїх прикладних номерах, додано трубу в grep)


1

grep -A 10 <Паттерн>

Це потрібно, щоб захопити візерунок та наступні 10 рядків після шаблону. Це було б добре лише для відомого шаблону, якщо у вас немає відомого шаблону, використовуйте пропозиції "голови".


1
Хоча це може бути правильним. додайте більше опису питання, щоб зробити відповідь більш вичерпною.
Прамод С. Нікам

3
Це дає відповідь на зовсім інше питання і не є корисним у цьому контексті.
Pre101

-1

У мене була подібна проблема, і всі вищезазначені проблеми не вирішують її повністю. Мені також цікаво отримати ім'я файлу, що містить відповідні рядки. Моє рішення:

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

NB: Шаблон у моєму випадку завжди відповідає першому рядку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.