Bagaimana cara grep untuk string yang sama tetapi banyak file sekaligus?

57

Saya memiliki satu set file log yang perlu saya tinjau dan saya ingin mencari string spesifik pada file yang sama sekaligus. Apakah ini mungkin? Saat ini saya menggunakan

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

Bagaimana saya menggunakan ini dan mencari untaian beberapa file sekaligus? Jika ini adalah sesuatu yang perlu dituliskan, dapatkah seseorang memberikan naskah sederhana untuk melakukan ini?

pengguna53029
sumber
2
grepdapat mengambil lebih dari satu argumen file.
jw013

Jawaban:

61
grep -E 'fatal|error|critical|failure|warning|' *.log
JigarGandhi
sumber
Bagaimana saya bisa grepmelewati direktori, tetapi masih memeriksa semua file secara rekursif? grep -E 'text' **/*berfungsi, tetapi memberikan pesan kesalahan untuk setiap subdirektori (dan kemudian dengan benar memeriksa semua file di dalamnya)
Jorn
4
@Jorn, sungguh Anda harus mengajukan pertanyaan baru, tetapi gunakanfind . -type f -exec grep -E 'fatal|error|critical|failure|warning' {} +
Wildcard
20

Anda dapat menggunakan sesuatu seperti ini:

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

Ini akan menemukan setiap file dengan .logekstensi dan menerapkan grepperintah.

jherran
sumber
Itu terlalu mudah :) Sebenarnya semua file saya adalah .log jadi "grep -E 'fatal | error | critical | kegagalan | peringatan' * .log bekerja juga. Terima kasih!
user53029
1
Apa upaya yang hebat dari pemahaman / adaptasi user53029!
Gilles Quenot
1
Mengapa repot-repot dengan xargsdan kemungkinan kerusakan parah pada spasi putih dalam nama file saat Anda bisa menggunakannya find . -name '*.log' -exec grep -E 'fatal|error|critical|failure|warning' {} +?
Wildcard
16

Jika lebih sederhana, Anda bisa menentukan masing-masing file satu demi satu.

grep -E 'fatal|error|critical|failure|warning' file1.log file2.log 
flickerfly
sumber
2
Sangat sederhana, tetapi terlalu lama mencari ini: 0
Adam Hughes
3

Jika Anda perlu memahami sekumpulan nama file yang sewenang-wenang yang tidak dapat diambil dengan ekspresi reguler:

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

Apa keuntungan dari menempel nama file satu demi satu? Anda dapat menyusun daftar nama file pada file teks dan kemudian menempelkannya.

Diego Pino
sumber
1

Jika Anda ingin mencari secara rekursif dalam file subdirektori juga, maka Anda dapat menggunakan perintah di bawah ini

Ini akan mencari secara rekursif dalam file subdirektori juga

egrep -r "string1|string2" pathname
Praveen Kumar BS
sumber
1
tentang egrep
Jeff Schaller
0

Ini adalah tugas yang sangat memakan waktu. Dan ya, itu tentu perlu dituliskan jika Anda akan mencari beberapa string dalam beberapa log yang berbeda pada saat yang sama. Tetapi saya baru-baru ini harus melakukan ini dan itu cukup menyakitkan. Namun demikian, ini dilakukan dan siap dan dapat diunduh dari tautan berikut:

Unduh Script Pencarian Log

Cara kerjanya cukup sederhana.

Skenario 1: Pantau SATU string hanya dalam SATU file log

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

Skenario 2: Pantau string MULTIPLE hanya dalam SATU file log

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

Skenario 3: Memantau string Tunggal / Banyak dalam beberapa file log

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

Catatan:

_P_ berarti ATAU - Ini menggantikan pipa "|" simbol karena kecil kemungkinan Anda harus mencari string yang mengandung "_P_". Jika Anda tidak ingin mengetik "_P_", Anda bisa mengganti _P_ dengan "|".

Saat menggunakan skrip ini, parameter yang akan sering Anda ubah adalah:

  1. File log atau direktori log yang akan dimonitor
  2. Usia file log harus dipantau..yaitu jangan memonitor atau menemukan file log apa pun yang memiliki stempel waktu lebih dari 60 menit
  3. String / pola yang ingin Anda perhatikan
  4. Tag - ini adalah argumen kedua hingga terakhir yang harus Anda berikan. Ini mencatat statistik tentang file log yang sedang Anda pantau di bawah / var / tmp / logXray
  5. Opsi log -ndshow - Ini adalah parameter yang ingin Anda gunakan jika Anda ingin menampilkan entri dari log yang ditemukan cocok dengan pola yang Anda tentukan. Jika Anda hanya ingin melihat jumlah total setiap pola yang ditemukan, cukup ganti '-ndshow' dengan '-ndfoundmul'.

Saat menggunakan '-ndfoundmul', Anda akan mendapatkan output yang mirip dengan:

[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) 

Solusi untuk Masalah Poster Asli: Pindai Banyak string dalam banyak file log

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

OS: Ini diuji di Ubuntu dan Red Hat

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

Ini akan mencari 'fatal atau error atau critical atau failure atau warning atau search-string' dalam file dengan nama yang dimulai dengan 'log_file?' dan ekstensi 'lo ' * di path / path / ke / file / / dan berikan string pencarian warna acak dan nomor baris cetak yang ditemukan di.

Obaid
sumber
Tentu ini adalah jawaban yang berfungsi, tetapi pengguna meminta pencarian menggunakan pola, Anda menjawab menggunakan string pencarian tetap. Maaf, tetapi menambahkan hal-hal yang tidak diminta, seperti penomoran baris dan pewarnaan hasil sepertinya tidak membuat jawaban lebih menguntungkan. Tetapi akan ada pertanyaan lain yang kemungkinan bisa dijawab grepketerampilan Anda jadi semoga beruntung pada karir USE Anda!
zagrimsan
titik @zagrimsan diambil, saya telah menambahkan -E 'fatal | kesalahan | kritis | kegagalan | peringatan |' param untuk itu.
Obaid
Dan hei, dia secara khusus meminta banyak file, bukan pola pencarian. Silakan baca pertanyaan lagi.
Obaid
Kutipan dari Q: "string pencarian spesifik", dan pertanyaannya menunjukkan pola pencarian (berisi beberapa string yang cocok dengan) yang ia gunakan. Anda benar bahwa judul pertanyaannya sedikit berbeda dari apa yang sebenarnya dia tanyakan. BTW, -Edan -Ftidak dapat digunakan pada saat yang sama, mereka saling bertentangan (salah ketik).
zagrimsan
0

Jawaban JigarGandhi menunjukkan penggunaan wildcard asterisk. Ada lebih banyak dari mereka dan Anda dapat melihatnya di sini atau dengan berlari man 7 glob.

Salah satunya yang menurut saya berguna adalah rentang yang cocok dengannya []. Karena sistem yang saya kerjakan menghasilkan file log berurutan misalnya product.log.1 product.log.2 ... product.log.200, itu berguna untuk melakukan grep dengan satu perintah pada 3 atau 4 file berurutan tetapi tidak lebih. Jadi ini

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

akan menerima semua file yang diakhiri dengan product.log. 5, 6 atau 7. Wildcard tidak perlu ada di akhir sehingga jawaban flickerfly dapat disederhanakan

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

Perhatikan juga bahwa wildcard ini dapat digunakan dalam perintah lain juga seperti di cpmisalnya.

Stelios Adamantidis
sumber
0

Anda juga dapat menggunakan kurung kurawal jika file semua folder yang sama.

Lihat sebuah contoh

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

Jika Anda menambahkan s ke grep ini menekan kesalahan tentang file yang hilang

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

Saya hanya bereksperimen dengan ini sendiri untuk melakukan perintah yang bekerja di beberapa distro di mana itu dalam satu file vs yang lain karena perbedaan OS.

Log surat

sudo grep -is [email protected] /var/log/{maillog,exim_mainlog,exim_rejectlog,mail.log,mail.err,syslog}

Log Surat yang Diarsipkan menggunakan 2> / dev / null untuk menekan zgrep yang hilang .gz peringatan

sudo zgrep -is [email protected] /var/log/{maillog*,exim_mainlog*,exim_rejectlog*,mail.log*,mail.err*,syslog*} 2>/dev/null

Referensi: Apakah ada cara untuk merujuk ke beberapa file dalam direktori tanpa mengetik ulang seluruh path?

mikrofon
sumber