「sort」と「uniq」があることを知っていますが、今日の質問はAWKを使用してこの種のタスクを実行する方法です。実際のリスト(ips、名前、または数字)があり、それをソートしたいとしましょう。
以下は、メールログからIP番号を取得する方法の例です。
awk 'match($0,/\[[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\]/) { if ( NF == 8 && $6 == "connect" ) {print substr($0, RSTART+1,RLENGTH-2)} }' maillog
同じawkコマンドで「いつでもどこでも」IPをソートできますか?私の質問に対する完全な答えは必要ありませんが、どこから始めるべきかについていくつかのヒントが必要です。
乾杯!
答え1
ソートするには、次のようにコマンドの内部にパイプを使用することもできますawk
。
awk '{ print ... | "sort ..." }'
この構文は、データファイルの対応する行がすべて同じソートインスタンスに渡されることを意味します。
もちろん、シェルレベルでも同じことができます。
awk '{ print ... }' | sort ...
awk
あるいは、独自に複数のソート機能を定義するGNUを使用することもできます。
これは通常、「固有のデータ要素またはキー」を連想配列に保存し、新しいデータを記憶する必要があることを確認することによって行われますuniq
。awk
説明できる例を見てください。
awk '!a[$0]++'
つまり、現在の行が配列にない場合、条件は true で、その行を印刷する基本ジョブがトリガーされます。同じデータを持つ後続の行でエラー条件が発生し、データは印刷されません。
答え2
二重引用符を使用することは私にとって効果的でした。
substr(a[1],1,5) 印刷 "sort -u" # 一意の値