web-dev-qa-db-ja.com

'egrep -o "success | error | fail" <filename>の代替|並べ替え| uniq -c '

私は時々いくつかのログを確認する必要があり、このコマンドでこれを行います:

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

短いコマンドでこれを行う方法を誰かが知っているかどうか知りたいですか?

別のコマンドを使用してこれを行う理由を尋ねる前に...特別な理由はありませんが、私は好奇心が強いです:)

8
Wolfy

これがawkの方法です

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

しかし、これらの1つのライナーはすべて、古き良きgrepよりも少し長くなります。

4
devav2

いいえ、あなたはそれと同じくらい良いと思います。当然、1つのPerlスクリプトでそれを行うことができますが、

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

...しかし、より複雑で直感的ではありません。

4
January

それほど短くはありませんが、正規表現は本当に必要ないので、fgrepgrep -F)。

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

同じことをbashで書く別の方法:

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

次のように、単純なbashスクリプトを記述してからスクリプトを呼び出すことができます。

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

それを(たとえば)myscript.shとして保存します。次にchmod +x myscript.shを実行すると、myscript.sh <filename>のように呼び出すことができます。

1
jeremija

あなたの命令は、短くて甘いが、用語の出現を数えるかなり遠回りの方法です。私はおそらく、鈍い、直接的なアプローチを取り、シェルループ内でgrepの-cフラグ(正確にそれを実行します)を使用します。

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

それほど大きくなく、エキサイティングでもなく、大きなログファイルの場合は潜在的に高速です(sortなし)。私はそれが洗浄だと言うでしょう。

0
Ternary