Alternatif untuk 'egrep -o “success | error | fail” <filename> | sortir | uniq -c '

8

Saya kadang perlu memeriksa beberapa log dan saya melakukan ini dengan perintah ini:

egrep -o "success|error|fail" <filename> | sort | uniq -c

Input sampel:

test error on line 10
test connect success
test insert success
test started at 00:00
test delete  fail

Output sampel:

1 error
1 fail
2 success

Saya ingin tahu apakah ada yang tahu cara melakukan ini dengan perintah yang lebih pendek?

Sebelum Anda bertanya mengapa saya ingin melakukan ini dengan perintah yang berbeda ... Tidak ada alasan khusus, saya hanya ingin tahu :)

Wolfy
sumber

Jawaban:

4

Inilah awkcara melakukannya

awk 'BEGIN{RS=" "}/success/{s++}/fail/{f++}/error/{e++}END{print "Success:"s" Failed:"f" Error:"e}' abc

Tapi semua liners ini akan lebih panjang dari yang lama kita grep

devav2
sumber
4

Tidak, saya pikir Anda sebagus itu. Tentu, Anda bisa melakukannya dengan satu skrip perl,

perl -nle  's/.*(error|fail|success).*/$1/ && $a{$_}++ ; END {  print "$_ $a{$_}" for keys %a } ' test.txt

... tetapi lebih kompleks dan kurang intuitif.

Januari
sumber
Saya menambahkan input sampel ke pertanyaan saya ... Harapan bahwa sekarang lebih jelas apa yang dilakukan perintah ... teori untuk ketidaknyamanan ini
Wolfy
1
OK, saya memodifikasi perl oneliner sesuai. Saya masih berpikir bahwa solusi Anda dengan egrep lebih baik dan lebih intuitif.
Januari
2

Tidak jauh lebih pendek, tetapi karena Anda tidak benar-benar membutuhkan ekspresi reguler, ada fgrep( grep -F).

fgrep 'success
error
fail' "$filename" | sort | uniq -c

cara lain untuk menulis hal yang sama di bash:

fgrep $'success\nerror\nfail' "$filename" | sort | uniq -c
kojiro
sumber
1

Anda dapat menulis skrip bash sederhana dan kemudian memanggil skrip tersebut, seperti:

#!/bin/bash
egrep -o "success|error|fail" "$1" | sort | uniq -c

dan simpan sebagai (misalnya) myscript.sh. Kemudian lakukan chmod +x myscript.shdan Anda bisa menyebutnya seperti myscript.sh <filename>.

jeremija
sumber
Tetapi dalam hal ini perintahnya sama ... Anda baru saja membuat skrip yang memanggil perintah ...
Wolfy
Saya pikir Anda hanya ingin mempercepat pengambilan log Anda. Hanya ingin tahu, mengapa Anda menginginkan perintah alternatif jika yang sudah Anda berikan berfungsi dengan baik untuk Anda?
jeremija
seperti saya katakan: Saya hanya ingin tahu bagaimana orang lain melakukan sesuatu seperti itu ... berkali-kali saya menyadari bahwa orang tahu cara mewah / baik untuk melakukan sesuatu dan saya suka saya belajar sekarang cara untuk melakukan sesuatu ...
Wolfy
2
Dalam hal ini, Anda adalah orang itu :-) Baris perintah Anda bagus, singkat, jelas dan memanfaatkan kekuatan baris perintah Unix. Apa lagi yang diharapkan?
Januari
0

Perintah Anda, walaupun pendek dan manis, adalah cara yang agak berputar untuk menghitung kemunculan suatu istilah. Saya mungkin akan mengambil pendekatan langsung, tumpul dan menggunakan grep's -c flag (yang melakukan hal itu) di dalam lingkaran shell:

for i in success test fail; do echo `grep -c $i <filename>` $i; done

Tidak sesingkat, tidak menarik, berpotensi lebih cepat untuk file log besar (tidak sort). Saya akan mengatakan itu mencuci.

Ternary
sumber
-1

Ini bisa menjadi jawaban bodoh tetapi saya pikir, dalam hal ini, sortsangat tidak berguna; mungkin Anda bisa menghilangkannya. Namun demikian di sini kita menggunakan tiga perintah berbeda untuk tiga tindakan berbeda.

Kita dapat menyingkatnya jika beberapa dari mereka dapat dihubungi dengan beberapa opsi grep, tapi saya tidak melihat yang mana ... :)

Alessio Tomelleri
sumber
2
Tidak, itu tidak, jika tidak, uniq hanya akan menghitung instance dari istilah pencarian yang berurutan . Misal jika Anda sukses, sukses, gagal, sukses, maka keluaran uniq akan menjadi 2 success 1 fail 1 success.
Januari
tidak apa-apa ... sry
Alessio Tomelleri