数千行のログファイルがあります。数百行までフィルタリングできます。ほとんどの行は同じ情報を含む重複行なので、これらの重複行の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]
最初に発生した場合にのみ真です。