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


8

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

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

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

なぜ私がこれを別のコマンドで実行したいのかを尋ねる前に...特別な理由はありません。

回答:


4

ここにawkそれを行う方法があります

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

しかし、これらすべてのワンライナーは、私たちの古き良きものよりも少し長くなります grep


4

いいえ、あなたはそれが得意であると思います。もちろん、1つのperlスクリプトでそれを行うことができます。

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

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


私は質問にサンプル入力を追加しました...コマンドが何をするのかがより明確になることを願っています...ご不便をおかけして申し訳ありません
Wolfy

1
OK、それに応じてperl onelinerを変更しました。私はまだegrepを使用したソリューションの方がより直感的であると思います。
1

2

それほど短くはありませんが、正規表現は実際には必要ないため、fgrepgrep -F)があります。

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

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

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

1

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

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

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


しかし、この場合、コマンドは同じです...あなただけのコマンドを呼び出すスクリプトを作成しました...
Wolfy

ログのグレッピングを高速化したいだけだと思いました。好奇心旺盛ですが、既に提供したコマンドがうまく機能しているのに、なぜ代替コマンドが必要なのですか?
jeremija 2012

私が言ったように:私は他の人がそのようなことをする方法に興味があります...多くの人が物事を行うためのファンシー/素敵な方法を知っていることに気づき、私はあなたが今物事を行う方法を学ぶのが大好きです
Wolfy

2
その場合、あなたはその人です:-)あなたのコマンドラインは素晴らしく、簡潔で、明確で、Unixコマンドラインの力を利用します。他に何を望みますか?

0

コマンドは短くて甘いですが、用語の出現を数えるためのかなり遠回りの方法です。おそらく、率直で直接的なアプローチをとり、シェルループ内でgrepの-cフラグ(これはまさにそれを行います)を使用します。

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

大規模なログファイルの場合は、短くもエキサイティングでもなく、潜在的に高速です(いいえsort)。ウォッシュだと思います。


-1

これはダミーの回答になる可能性がありますが、この場合、sortまったく役に立たないと思います。省略できるかもしれません。それにもかかわらず、ここでは3つの異なるアクションに3つの異なるコマンドを使用しています。

それらのいくつかがいくつかのオプションで到達した場合、それを短絡させることができますがgrep、私はそれがわかりません... :)


2
いいえ、そうではありません。それ以外の場合、uniqは検索語の連続したインスタンスのみをカウントします。たとえば、成功、成功、失敗、成功がある場合、uniqの出力はになります2 success 1 fail 1 success

それは大丈夫です... sry
アレッシオ・トメレッリ2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.