Aynı dize ama aynı anda birden fazla dosya grep nasıl?


57

Gözden geçirmem gereken bir takım günlük dosyalarım var ve aynı dosyadaki belirli dizeleri aynı anda aramak istiyorum Bu mümkün mü? Şu anda kullanıyorum

grep -E 'fatal|error|critical|failure|warning|' /path_to_file

Bunu nasıl kullanabilirim ve aynı anda birden fazla dosyanın dizelerini nasıl arayabilirim? Bu komut dosyası yazılması gereken bir şeyse, birisi bunu yapmak için basit bir komut dosyası sağlayabilir mi?


2
grepbirden fazla dosya argümanı alabilir.
jw013

Yanıtlar:


61
grep -E 'fatal|error|critical|failure|warning|' *.log

grepDizinleri nasıl atlayabilirim, ancak tüm dosyaları tekrar tekrar kontrol edebilir miyim? grep -E 'text' **/*çalışır, ancak her alt dizin için bir hata mesajı verir (ve daha sonra içlerindeki tüm dosyaları doğru bir şekilde kontrol eder)
Jorn

4
@Jorn, gerçekten yeni bir soru sormalısın, ama kullanfind . -type f -exec grep -E 'fatal|error|critical|failure|warning' {} +
Wildcard

20

Böyle bir şey kullanabilirsiniz:

find . -name "*.log" | xargs grep -E 'fatal|error|critical|failure|warning|'

Bu, .loguzantı olarak her dosyayı bulur ve grepkomutu uygular .


Bu benim tüm dosyaları "öylesine .log olan Aslında :) çok kolay oldu grep -E çok teşekkürler çalışır .log * 'ölümcül | uyarı hatası | kritik | | başarısızlık'.!
user53029

1
Ne büyük bir anlama / uyarlama çabası var user53029!
Gilles Quenot

1
Neden kullanabiliyorsanız , dosya adlarında boşlukta ciddi kırılmaxargs olasılığı ve neden bu kadar rahatsız olmalısınız ? find . -name '*.log' -exec grep -E 'fatal|error|critical|failure|warning' {} +
Joker

16

Daha basitse, her dosyayı birbiri ardına belirtebilirsiniz.

grep -E 'fatal|error|critical|failure|warning' file1.log file2.log 

2
Çok basit, ama bunu çok uzun zamandır arıyordu: 0
Adam Hughes

3

Düzenli bir ifadeyle alınamayan rastgele bir dosya adı grubunu izlemeniz gerekirse:

grep -E 'fatal|error|critical|failure|warning|' `cat<<FIN
> file1
> file2
> ...
> filen
> FIN`

Dosya adlarını birbiri ardına yapıştırmanın avantajı nedir? Dosya adı listesini bir metin dosyasında derleyebilir ve daha sonra yapıştırabilirsiniz.


1

Ayrıca alt dizin dosyalarında yinelemeli olarak arama yapmak istiyorsanız Ayrıca aşağıdaki komutu kullanabilirsiniz.

Ayrıca alt dizin dosyalarında yinelemeli olarak arama yapacaktır.

egrep -r "string1|string2" pathname


0

Bu çok zaman alan bir görevdi. Ve evet, aynı anda birden fazla farklı logdaki birden fazla dizgiyi arayacaksanız kesinlikle kod yazılması gerekiyordu. Ama son zamanlarda bunu yapmak zorunda kaldım ve çok acı vericiydi. Bununla birlikte, hazır ve hazır ve aşağıdaki linkten indirilebilir:

Günlük Arama Komut Dosyası İndirme

Bu işe yarar şekilde oldukça basittir.

Senaryo 1: Sadece bir günlük dosyasındaki BİR diziyi izler

./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m 'can.*t.*open' '.'  1 2 single_errCheck -ndshow

Senaryo 2: Sadece BİR günlük dosyasındaki ÇOK dizelerini izleyin

./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m 'can.*t.*open_P_ntpd.*stat' '.'  1 2 multi_errCheck -ndshow

Senaryo 3: Birden çok günlük dosyasında Tek / Birden çok dizeyi izleme

./logsearch.sh localhost /var/tmp/logXray autonda /var/log 60m 'can.*t.*open_P_ntpd.*stat' '.'  1 2 multi_err_multi_logCheck -ndshow

Notlar:

_P_, OR anlamına gelir - "|" borusunun yerini alır çünkü "_P_" içeren bir dize aramak zorunda kalacaksınız. "_P_" yazmak istemiyorsanız, _P_ yerine "|" ile kullanabilirsiniz.

Bu betiği kullanırken, sık sık değiştireceğiniz parametreler şunlardır:

  1. İzlenecek günlük dosyası veya günlük dizini
  2. Bir günlük dosyasının izlenmesi gereken yaş ... 60 dakikadan fazla zaman damgası olan herhangi bir günlük dosyasını izlemeyin veya keşfetmeyin
  3. İzlemek istediğiniz dizge / desen (ler)
  4. Etiket - bu, tedarik etmeniz gereken en son ikinci argümandır. / Var / tmp / logXray altında izlemekte olduğunuz günlük dosyalarıyla ilgili istatistikleri kaydeder.
  5. Log seçeneği -ndshow - Girdileri, belirttiğiniz desen (ler) ile eşleşen bulunan günlüklerden çıkarmak istiyorsanız, kullanmak istediğiniz parametredir. Bulunan her desenin toplam sayısını görmek istiyorsanız, sadece '-ndshow'u' -ndfoundmul 'ile değiştirin.

'-Ndfoundmul' kullanırken, şuna benzer bir çıktı alırsınız:

[root@dgphxtest001]# ./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m 'can.*t.*open_P_ntpd.*stat' '.'  1 2 blahblahA -ndfoundmul
OK: [/var/log/messages][1]  /var/log/messages:P=(can_t_open=0 ntpd_stat=0)_F=(117s)_R=(228,228=0) 

Orijinal Posterin Sorununa Çözüm: Birden fazla günlük dosyasında Birden çok dize tara

./logsearch.sh localhost /var/tmp/logXray autonda /var/log 60m 'fatal_P_error_P_critical_P_failure_P_warning' '.'  1 2 multierr_logCheck -ndshow

İşletim Sistemleri: Bu, Ubuntu ve Red Hat'ta test edildi.


0
grep -EFn "fatal|error|critical|failure|warning|search-string" /path/to/the/file/log_file?.lo* --color=auto

Bu, 'log_file?' İle başlayan dosya adında 'ölümcül veya hata veya kritik veya başarısızlık veya uyarı veya arama dizesini' arayacaktır. ve / yolunda / to / the / dosya / dizinindeki 'lo ' * ifadesi ve arama dizgisine rastgele bir renk ve bulunduğu satır numarasını yazdırın.


Bunun çalışan bir cevap olduğundan emin olun, ancak kullanıcı bir model kullanarak arama yapmayı istedi, sabit bir arama dizesi kullanarak cevapladınız. Üzgünüz, ancak istenmeyen şeyleri eklemek, sonuçların satır numaralandırılması ve renklendirilmesi gibi bir cevabı daha yararlı hale getirme olasılığı yoktur. Ancak, grepustalık kariyerinizde şansınızı en iyi şekilde değerlendirmek için becerilerinize cevap verebilecek başka sorular da olacak !
zagrimsan

@zagrimsan puan aldı, -E 'fatal | error | critical | failure | warning |' ekledim ona param.
Obaid

Ve hey, özellikle bir arama modeli değil, birden fazla dosya istedi. Lütfen soruyu tekrar okuyun.
Obaid

Q'dan alıntı: "belirli dizeleri ara" ve soru kullandığı arama desenini (eşleşecek birden çok dizeyi içeren) gösterir. Yine de, sorunun başlığının gerçekte istediği şeyden biraz uzakta olduğu konusunda haklısın. Btw -Eve -Faynı anda kullanılamaz, çakışıyorlar (yazım hatası?).
zagrimsan

0

JigarGandhi'nin cevabı yıldız jokerinin kullanımını göstermektedir. Onlardan daha fazlası var ve onları burada ya da koşarak görebilirsiniz man 7 glob.

Yararlı bulduğum onlardan biri ile eşleştirilen aralık []. Üzerinde çalıştığım sistem sıralı olarak numaralandırılmış log dosyaları ürettiğinden product.log.1 product.log.2 ... product.log.200, örneğin , 3 veya 4 sıralı dosya üzerinde tek bir komutla grep yapmak kolaydır, fakat daha fazla değil. Yani bu

grep 'whatever' product.log.[5-7]

product.log ile biten tüm dosyalar için grep. 5, 6 veya 7. Jokerin sonunda olması gerekmez, böylece flickerfly'nin cevabı basitleştirilebilir.

grep -E 'fatal|error|critical|failure|warning' file[1,2].log

Ayrıca, bu joker karakterlerin, cpörneğin olduğu gibi diğer komutlarda da kullanılabileceğini unutmayın .


0

Tüm dosyalar aynı klasördeyse, küme parantezleri de kullanabilirsiniz.

Bir örneğe bakın

grep -E 'fatal|error|critical|failure|warning|' /var/log/{messages,secure,syslog,dmesg}

Grep'e bir s eklerseniz, bu eksik dosyalar hakkındaki hataları gizler.

grep -sE 'fatal|error|critical|failure|warning|' /var/log/{messages,secure,syslog,dmesg}

Ben sadece bununla ilgili denemeler yapıyordum, işletim sistemi farklılıkları nedeniyle bir dosyada diğerinde birden fazla dağıtımda çalışan komutları yapıyordum.

Mail günlükleri

sudo grep -is bob@example.com /var/log/{maillog,exim_mainlog,exim_rejectlog,mail.log,mail.err,syslog}

Arşivlenmiş Posta Günlüklerini zgrep eksik .gz uyarılarını bastırmak için 2> / dev / null kullanarak

sudo zgrep -is bob@example.com /var/log/{maillog*,exim_mainlog*,exim_rejectlog*,mail.log*,mail.err*,syslog*} 2>/dev/null

Başvuru: Tüm yolu yeniden yazmadan bir dizindeki birden fazla dosyaya başvurmanın bir yolu var mı?

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.