Ambil log untuk kata tertentu hanya jika diikuti oleh kata lain

0

Saya memiliki file log dengan entri seperti berikut:

Memasukkan

php notice bob
php notice winner
php notice blah winner
php notice asfsdf test
php erro)r bob                                                                                                
php error winner
php error trash winner
php error junk test
print this line

Keluaran

php notice winner
php notice blah winner                                                                                        
php error winner
php error trash winner
print this line

Apa yang saya coba lakukan adalah mencocokkan semua baris dari file log kecuali - berisi php diikuti oleh error atau notice. Jika berisi php diikuti oleh error atau notice, maka itu hanya akan cocok jika winner juga dalam string. Regex-foo saya lemah. Terima kasih.

Brian
sumber

Jawaban:

1

Gunakan ini: grep 'php\s\+\(error\|notice\).*winner' mylogfile

jeffgao
sumber
0

Mungkin ada cara untuk mendapatkan grep untuk melakukan itu dalam satu string tetapi saya pikir secara pribadi saya akan membuatnya skrip untuk mengatasinya dalam perl atau bash. Dalam bash itu akan menjadi sesuatu seperti

while read line
do
# If line contains "php error" or "php notice" and "winner", print it, else skip it
   if echo $line | grep "php error" >/dev/null  || echo $line | grep -q "php notice" >/dev/nulll; then
       if echo $line | grep "winner" > /dev/null; then
           echo $line
       fi
   else 
   # If line does not contain "php error" or "php notice", print it.
       echo $line
   fi
done

Saya tidak memiliki sistem yang berguna untuk menguji / men-debug ini sekarang, jadi Anda mungkin harus sedikit mengubahnya.

OldWolf
sumber
Terima kasih. Saya masih berharap menemukan regex untuk itu. Saya bergabung ke file di ekor dan satu file harus cocok dengan pola "php (warning | error). + Bcooper" tetapi file lainnya tidak. Masalahnya adalah Anda tidak dapat menangkap salah satu file yang berurutan.
Brian
Ini masih akan bekerja untuk itu. Saya kira Anda menggunakan 'tail -f file -d file' Jika demikian, Anda tinggal menambahkan skrip Anda sampai akhir. 'tail -f file -f file | naskah'
OldWolf