Çok uzun günlük dosyalarım var, grep'ten yalnızca ilk 10 satırı aramasını istemek mümkün mü?
Ç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:
Boruların büyüsü;
head -10 log.txt | grep <whatever>
head log.txt | grep <whatever>
-l
seçeneğini kullanırken bunu yapmanın bir yolu var mı ? İlk 5 karakteri olan tüm dosyaları listelemek istiyorum RIFFD
.
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..nextfile
10 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
FNR=1
sadece 1. satırı arayacaktır. Teşekkürler!
find ./path -type -f -exec awk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' '{}' +
-type f
Veya awk
tek bir işlem için kullanın |
:
awk '/your_regexp/ && NR < 11' INPUTFILE
Her satırda, your_regexp
eş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 ( -n
aksi takdirde varsayılan olan girdiyi yazdırmayın anlamına gelir) ve 10. satırdan hemen sonra çıkar.
awk '{ if ( NR <= 10 ) { if(index($0,"ab") > 0) { print $0; } } else { exit; } }' textfile
-- Daha hızlı.
awk '{ if ( NR <= 10 ) { if( $0 ~ "YOUR_REGEXP") { print } } else { exit; } }' textfile
yapar.
awkish
. 2xifs
ve 1xelse
eylem ifadesine ihtiyaç duymayan bir komutta aho olur. weinberger ve kernighan ağlıyor ...
İle birlikte programları kullanarak birkaç seçeneğiniz var grep
. Bence en basit olanı kullanmak head
:
head -n10 filename | grep ...
head
ilk 10 satırın çıktısını alır ( -n
seçeneği kullanarak ) ve sonra bu çıktıyı borulayabilirsiniz grep
.
head
kullandık -n 10
(ben dahil) hayata değil head
tarafından varsayılan görüntüler sadece 10 satır . :)
grep "pattern" <(head -n 10 filename)
Aşağıdaki satırı kullanabilirsiniz:
head -n 10 /path/to/file | grep [...]
Bunu başarmak head -10 file
için çıktı borulanabilir grep
:
head -10 file | grep …
Perl Kullanımı:
perl -ne 'last if $. > 10; print if /pattern/' file
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.
-C 2
aynısını yapacağım-A 2 -B 2
grep -m6 "string" cov.txt
Bu sadece ilk 6 satırı arar string
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 head
ile 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)
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.
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.
head
:someCmd | head -10