私はawkに初めて触れたので、この質問を受けたかもしれませんが、問題に対する解決策を見つけることができません。
awkを使用してsyslogで文字列を検索し、次の単語の境界まで値を印刷したいだけです。
ルール:
- awkのみ使用できます。
- Linuxでは、1行のコマンドでなければなりません。
テストデータ:システムログには、ファイアウォールがパケットをドロップしたときに生成されたエントリが含まれています。この情報行には複数の値が含まれており、長さが異なります(NFは忘れてください)。 ソースIPは常にSRC =で始まります。
私が今まで持っているもの:
awk '/SRC=/ { print $13 }' /var/log/syslog*
しかし、問題は、フィールド13が常にSRC値ではないことです。
残りの解決策はこの質問で見ることができます。限られた緑のリスト
ベストアンサー1
牛に似た一種の栄養awk
解決策:
awk -v FPAT='SRC=[^[:space:]]+' 'NF{ print $1 }' /var/log/syslog*
これにより、処理されたレコードがパターンに一致する1つのフィールドにのみ絞り込まれます。SRC=[^[:space:]]+
時間パフォーマンスの確認(testlog
22756行あり):
$ time(awk -v FPAT='SRC=[^[:space:]]+' 'NF{ print $1 }' testlog > /dev/null)
real 0m0.186s
user 0m0.164s
sys 0m0.000s
$ time(awk '{for(i=1;i<=NF;i++) {if ($i ~ /^SRC=/) print $i}}' testlog > /dev/null)
real 0m0.282s
user 0m0.256s
sys 0m0.000s