問題を解決するために、Webサイトで-f apacheアクセスログを追跡する必要があることがよくあります。 1つの迷惑なことは、一度にページを読み込む人がいる場合、ログに12行以上を記録できることです。私の場合はそれぞれかなり長いからです。端末の行。
tail -fはgrepとawkのパイプとうまく機能しているようで、IPアドレスが特定の瞬間に多くの要求をしたときに重複をフィルタリングする非常に簡単な解決策を思い出しました(また、私が一般的に使用する特定の情報に切り捨てます)。必要) -
tail -fログファイル| awk ' { print $1 " " $4 " " $9}' |
問題は、これがうまくいかないことです。大量の行を印刷する必要があることを知っていても、まったく出力はありません。
私はいくつかのトラブルシューティングを試しましたが、実際に動作させることはできません。
tail -f log.file | awk ' { print $1 " " $4 " " $9}'
これは私が思ったように正しく機能し、次のように(しかし重複する)行を印刷します。
12.34.56.78 [10/May/2016:18:42:01 200
12.34.56.78 [10/May/2016:18:42:02 304
12.34.56.78 [10/May/2016:18:42:02 304
12.34.56.78 [10/May/2016:18:42:02 304
12.34.56.78 [10/May/2016:18:42:02 304
12.34.56.78 [10/May/2016:18:42:02 304
12.34.56.78 [10/May/2016:18:42:02 304
12.34.56.78 [10/May/2016:18:42:02 304
tail log.file | awk ' { print $1 " " $4 " " $9}' | uniq
これは私が思ったように正しく機能し、重複行をフィルタリングします。ただし、トラブルシューティングにはリアルタイムアップデートが必要です。tail -f
tail -f
重複行をフィルタリングする方法は?
ベストアンサー1
純粋なawkソリューションで次のことを試してください。
tail -f log.file | awk ' $0!=last{ print $1 " " $4 " " $9} {last=$0}'
このコマンドは、入力行が前の入力行と異なる場合にのみ、新しい出力行を印刷します。
わずかな変更で、この出力ラインは古い出力ラインと異なる場合にのみ新しい出力ラインを印刷します。
tail -f log.file | awk '{$0=$1" "$4" "$9} last!=$0{print} {last=$0}'
はい
このテストファイルを試してみましょう。
$ cat logfile
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 11
1 2 3 4 5 6 7 8 19
1 2 3 4 5 6 7 8 19 12
1 2 3 4 5 6 7 8 19 13
1 2 3 4 5 6 7 8 19
1 2 3 4 5 6 7 8 29
awkは重複した出力ラインをフィルタリングします。
$ cat logfile | awk '{$0=$1" "$4" "$9} last!=$0{print} {last=$0}'
1 4 9
1 4 19
1 4 29