0

次のようなステートメントで access_logs を確認しています。

cat access_log | grep 16/Sep/2012:17 | awk '{print $12 $13 $14 $15 $16}' | sort | uniq -c | sort -n | tail -40

目的は、過去 1 時間にサーバーにアクセスしたユーザーのユーザー エージェントを、ヒット数でソートして表示することです。サーバーに異常なアクティビティがあり、不要なスパイダーなどを停止したい。

しかし、part:awk '{print $12 $13 $14 $15 $16}'は次のようなものとして非常に好まれます:awk '{print $12-through-end-of-line}'それぞれの長さが異なるユーザーエージェント全体を見ることができます。

awkでこれを行う方法はありますか?

4

5 に答える 5

2

非常にエレガントではありませんが、これは機能します:

grep 16/Sep/2012:17 access_log | awk '{for (i=12;i<=NF;++i) printf "%s ",$i;print ""}'

フィールド間の複数のスペースを 1 つに凝縮し、行末に余分なスペースを配置するという副作用がありますが、これはおそらく重要ではありません。

于 2012-09-21T18:33:47.933 に答える
2

見つけたことがありません。このような状況では、次を使用します (のフィールド分離の柔軟な処理はcut必要ないと仮定します):awk

# Assuming tab-separated fields, cut's default
grep 16/Sep/2012:17 access_log | cut -f12- | sort | uniq -c | sort -n | tail -40

# For space-separated fields (single spaces, not arbitrary amounts of whitespace)
grep 16/Sep/2012:17 access_log | cut -d' ' -f12- | sort | uniq -c | sort -n | tail -40

(明確化:良い方法を見つけたことはありません。必要に応じて @twalberg の for ループを使用しましたがcut、可能であれば使用することを好みます。)

于 2012-09-21T18:34:12.857 に答える
1
$ echo somefields:; cat somefields ; echo from-to.awk: ; \
  cat from-to.awk ; echo ;awk -f from-to.awk  somefields 
somefields:
a b c d e f g h i j k l m n o p q r s t u v w x y z
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
from-to.awk:
{ for (i=12; i<=NF; i++) { printf "%s ", $i }; print "" }

l m n o p q r s t u v w x y z 
12 13 14 15 16 17 18 19 20 21 

男 awk から:

NF 現在の入力レコードのフィールド数。


したがって、基本的には、12 から最後のフィールドまで (スペースで区切られた) フィールドをループします。

于 2012-09-21T18:50:24.547 に答える
0

なぜだめですか

  #!/bin/bash
  awk "/$1/"'{for (i=12;i<=NF;i++) printf("%s ", $i) ;printf "\n"}' log | sort | uniq -c | sort -n | tail -40 

スクリプトファイル内。

その後、あなたはそれを次のように呼ぶことができます

 myMonitor.sh 16/Sep/2012:17

この権利をテストする方法はありません。フォーマット/構文エラーの謝罪。うまくいけば、あなたはアイデアを得るでしょう。

IHTH

于 2012-09-21T18:35:50.313 に答える
0
awk '/16/Sep/2012:17/{for(i=1;i<12;i++){$i="";}print}' access_log| sort | uniq -c | sort -n | tail -40
于 2012-09-24T10:30:47.673 に答える