У мене дуже довгі файли журналів, чи можна попросити 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..nextfile
припиняє обробку файлу один раз 10 рядків були помічені. У //..{}
друкує ім'я файлу і переміщується на всякий раз , коли перший матч в даний файл показує вгору. Для цитування імен файлів на користь інших програм використовуйте
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( $0 ~ "YOUR_REGEXP") { print } } else { exit; } }' textfile
робить.
awkish
. 2xifs
і 1xelse
в команді, яка не потребує операції про дію, було б добре. weinberger and 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 -A 10 <Паттерн>
Це потрібно, щоб захопити візерунок та наступні 10 рядків після шаблону. Це було б добре лише для відомого шаблону, якщо у вас немає відомого шаблону, використовуйте пропозиції "голови".
У мене була подібна проблема, і всі вищезазначені проблеми не вирішують її повністю. Мені також цікаво отримати ім'я файлу, що містить відповідні рядки. Моє рішення:
ls |parallel --gnu 'cat <(echo {}) <(head {})|grep -B1 -m1 -P "^>.*F3$"'
NB: Шаблон у моєму випадку завжди відповідає першому рядку.
head
:someCmd | head -10