行のインスタンスをフィルタリングして記録する方法

行のインスタンスをフィルタリングして記録する方法

数千行のログファイルがあります。数百行までフィルタリングできます。ほとんどの行は同じ情報を含む重複行なので、これらの重複行の1つだけを表示したいと思います。

cat file.log | grep "plugin time out"

hostA plugin time out
hostA plugin time out
hostA plugin time out
hostB plugin time out
hostB plugin time out
hostC plugin time out

この出力をどのように取得できますか?

hostA plugin time out
hostB plugin time out
hostC plugin time out

答え1

uniqにパイプを追加

cat file.log | grep "plugin time out" |uniq

答え2

いくつかのコメントと提案

  • 避ける猫に役に立たない用途。多くのコマンドは、ファイル名を入力として直接受け入れるか、そうでない場合はリダイレクトを使用できます。例えば:tr 'a-z' 'A-Z' < ip.txtまたは< ip.txt tr 'a-z' 'A-Z'
  • シェルの解釈を避けるには、単一引用符を使用してください。バラよりmywiki.wooledge - 引用


ソリューションの活用awk

$ awk '/plugin time out/ && !seen[$1]++' file.log
hostA plugin time out
hostB plugin time out
hostC plugin time out
  • /plugin time out/使い方と同じですgrep。フィルタラインマッチングplugin time out
  • !seen[$1]++その行の最初の列に基づいて一意の行のみをフィルタリングします。 (入力行はデフォルトでawk空白に分割され、フィールドは背中を介してアクセスできます$1$2
    • seen最初のフィールドをキーとして使用する連想配列。数値コンテキストのデフォルト値はです0。したがって、!seen[$1]最初に発生した場合にのみ真です。

関連情報