Bir dosyanın yalnızca ilk n satırını grepleyebilir miyim?


126

Çok uzun günlük dosyalarım var, grep'ten yalnızca ilk 10 satırı aramasını istemek mümkün mü?

Yanıtlar:


175

Boruların büyüsü;

head -10 log.txt | grep <whatever>

13
isteğe bağlı bir akışı şu şekilde de aktarabilirsiniz head:someCmd | head -10
— Stuart Nelson

1
Head varsayılan olarak ilk 10 satırı standart çıktıya yazdırmaktır, bu nedenle bu 10 satır için geçerlidirhead log.txt | grep <whatever>
— Zlemini

5
Grep'in -lseçeneğini kullanırken bunu yapmanın bir yolu var mı ? İlk 5 karakteri olan tüm dosyaları listelemek istiyorum RIFFD.
— James M. Lay

49

Bunu Google'da bulan kişiler için n, birden çok dosyanın ilk satırlarını aramam gerekiyordu, ancak yalnızca eşleşen dosya adlarını yazdırmam gerekiyordu. kullandım

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

FNR..nextfile10 satır bir kez dosyası işlenirken durur görülmektedir. //..{}Üzerinde baskılar dosya adı ve hamle zaman belirli bir dosya gösterileri kadar ilk maçı. Diğer programların yararına dosya adlarından alıntı yapmak için şunu kullanın:

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

9
Bunu Google'da bulanlardan biriydim. Teşekkürler!
— Floris

benim için bu kod dosyanın tam yolunu yazdırdı. Tam da ihtiyacım olan şey buydu. Ayrıca FNR=1sadece 1. satırı arayacaktır. Teşekkürler!
— Brian W

2
Bunu bir dizin üzerinden yinelemeli olarak yapmak için:find ./path -type -f -exec awk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' '{}' +
— OrangeDog

1
Teşekkürler @OrangeDog. Küçük bir düzeltme: olmalı-type f
— David Siegal

26

Veya awktek bir işlem için kullanın |:

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

Her satırda, your_regexpeşleşiyorsa ve kayıt sayısı (satır) 11'den azsa, varsayılan eylemi (giriş satırını yazdıran) yürütür.

Veya şunu kullanın sed:

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

Normal ifadenizi kontrol eder ve satırı yazdırır ( -naksi takdirde varsayılan olan girdiyi yazdırmayın anlamına gelir) ve 10. satırdan hemen sonra çıkar.


1
Neden 10'unda bırakmıyorsun? (sed çözümüne bakın)
— Potong

awk '{ if ( NR <= 10 ) { if(index($0,"ab") > 0) { print $0; } } else { exit; } }' textfile-- Daha hızlı.

1
@potong haklısın, düzeltildi. @srikanthradix daha hızlı olabilirken, çözümünüz normal ifadeler değil, yalnızca sabit dizeler arıyor. awk '{ if ( NR <= 10 ) { if( $0 ~ "YOUR_REGEXP") { print } } else { exit; } }' textfileyapar.
— Zsolt Botykai

4
Artı stil değil awkish. 2xifsve 1xelseeylem ifadesine ihtiyaç duymayan bir komutta aho olur. weinberger ve kernighan ağlıyor ...
— jaypal singh

1
Bence, NR yerine FNR kullanmak daha iyi olur, çünkü çok sayıda dosyayla awk kullanırsanız FNR her dosya için 0'dan başlar.
— Vladyslav Savchenko

9

İle birlikte programları kullanarak birkaç seçeneğiniz var grep. Bence en basit olanı kullanmak head:

head -n10 filename | grep ...

headilk 10 satırın çıktısını alır ( -nseçeneği kullanarak ) ve sonra bu çıktıyı borulayabilirsiniz grep.


6
Hatta burada kullanan tüm çözümler, fark etmedi headkullandık -n 10 (ben dahil) hayata değil headtarafından varsayılan görüntüler sadece 10 satır . :)
— jaypal singh



3

Bunu başarmak head -10 fileiçin çıktı borulanabilir grep:

head -10 file | grep …

Perl Kullanımı:

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

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

-A 2: desenden önce iki satır yazdırın.

-B 2: desenden sonra iki satır yazdırın.

head -10 log.txt # read the first 10 lines of the file.

1
Hatırlarsam, -C 2aynısını yapacağım-A 2 -B 2
— David LeBauer

3
grep -m6 "string" cov.txt

Bu sadece ilk 6 satırı arar string


3
Hayır, bu size tüm cov.txt dosyasında "string" ifadesinin ilk 6 oluşumunu verecektir
— franzisk

2

Joachim Isaksson cevabı bir uzantısı: Oldukça sık bu durumda birleştirebilirsiniz, 5020 örneğin uzun dosyanın ortasından şey, çizgiler 5001 lüzum headile tail:

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

Bu ilk 5020 satırını alıyor, sonra bunların sadece son 20'sini gösteriyor, sonra her şeyi grep'e aktarıyor.

(Düzenlendi: örnek numaralarımda çitpost hatası, grep'e boru eklendi)


1

grep -A 10 <Pattern>

Bu, deseni ve desenden sonraki 10 satırı almak içindir. Bu, yalnızca bilinen bir kalıp için işe yarar, eğer bilinen bir kalıbınız yoksa "baş" önerilerini kullanın.


1
Doğru olsa da. Yanıtı daha kapsamlı hale getirmek için daha fazla soru açıklaması ekleyin.
— Pramod S. Nikam

3
Bu, tamamen farklı bir soruyu yanıtlar ve bu bağlamda yararlı değildir.
— 2018 öncesi

-1

Benzer bir problemim vardı ve yukarıdaki problemlerin tümü onu tamamen çözmüyor. Eşleşen satırları içeren dosya adını almakla da ilgileniyorum. Çözümüm:

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

Not: Benim durumumdaki Desen her zaman ilk satırla eşleşir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.