私は時々いくつかのログを確認する必要があり、このコマンドでこれを行います:
egrep -o "success|error|fail" <filename> | sort | uniq -c
サンプル入力:
test error on line 10
test connect success
test insert success
test started at 00:00
test delete fail
サンプル出力:
1 error
1 fail
2 success
短いコマンドでこれを行う方法を誰かが知っているかどうか知りたいですか?
別のコマンドを使用してこれを行う理由を尋ねる前に...特別な理由はありませんが、私は好奇心が強いです:)
これがawk
の方法です
awk 'BEGIN{RS=" "}/success/{s++}/fail/{f++}/error/{e++}END{print "Success:"s" Failed:"f" Error:"e}' abc
しかし、これらの1つのライナーはすべて、古き良きgrep
よりも少し長くなります。
いいえ、あなたはそれと同じくらい良いと思います。当然、1つのPerlスクリプトでそれを行うことができますが、
Perl -nle 's/.*(error|fail|success).*/$1/ && $a{$_}++ ; END { print "$_ $a{$_}" for keys %a } ' test.txt
...しかし、より複雑で直感的ではありません。
それほど短くはありませんが、正規表現は本当に必要ないので、fgrep
(grep -F
)。
fgrep 'success
error
fail' "$filename" | sort | uniq -c
同じことをbashで書く別の方法:
fgrep $'success\nerror\nfail' "$filename" | sort | uniq -c
次のように、単純なbashスクリプトを記述してからスクリプトを呼び出すことができます。
#!/bin/bash
egrep -o "success|error|fail" "$1" | sort | uniq -c
それを(たとえば)myscript.sh
として保存します。次にchmod +x myscript.sh
を実行すると、myscript.sh <filename>
のように呼び出すことができます。
あなたの命令は、短くて甘いが、用語の出現を数えるかなり遠回りの方法です。私はおそらく、鈍い、直接的なアプローチを取り、シェルループ内でgrepの-cフラグ(正確にそれを実行します)を使用します。
for i in success test fail; do echo `grep -c $i <filename>` $i; done
それほど大きくなく、エキサイティングでもなく、大きなログファイルの場合は潜在的に高速です(sort
なし)。私はそれが洗浄だと言うでしょう。