2016-08-08 1 views
0

Apacheのaccess.logからほんの少数のデータを抽出する必要があり、awkコマンドで試したところ すべてのIPを表示する必要があります。 )を要求に近づけた時刻と比較する。awk:日付の高いipsの出現を抽出する

のaccess.logのパターンが続く

192.168.0.147 [08/Aug/2016:10:55:14 +0200] "GET /requestPath/ HTTP/1.1" 401 1638 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36" 

私だけ

awk '{print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -fr 

このスクリプトを生成することができたが、私は今、どのようにしませんが生成さ

LogFormat "%h %t \"%!200,304,302r\" %>s %O \"%!200,304,302{User-Agent}i\"" combined 

ようです日付を抽出する

は、すべてのヘルプは高く評価されるだろう

3 192.168.0.147 02/Aug/2016:11:55:14 
1 192.168.0.122 08/Aug/2016:10:15:11 

のaccess.log

192.168.0.147 [01/Aug/2016:10:55:14 +0000] ... 
192.168.0.147 [02/Aug/2016:10:55:14 +0000] ... 
192.168.0.147 [02/Aug/2016:11:55:14 +0000] ... 
192.168.0.122 [08/Aug/2016:10:15:11 +0000] ... 

所望の出力より明確にします! ありがとう

答えて

0

多分このような何か、:

$ awk '{sub(/^\[/,"",$2); a[$1]=$2;c[$1]++} END {for(i in a) print c[i],i,a[i]}' c 
3 192.168.0.147 02/Aug/2016:11:55:14 
1 192.168.0.122 08/Aug/2016:10:15:11 

日は、各特定のIPの最後のレコードの日付です。

{ 
    sub(/^\[/,"",$2) # remove [ 
    a[$1]=$1" "$2 # each ip gets it's own array element where last record is stored 
    c[$1]++}   # ips are counted 
END { 
    for(i in a)  # print count and last record 
     print c[i],i,a[i] 
} 
+0

あなたは、日付と時刻の間に空白を想定しているように見えるが、それはOPのサンプル内のすべての単一のフィールドにあります。 – tripleee

+0

いいえ、私はしませんでした。私はタイムゾーンを離れるつもりだったが、それを指摘してくれてありがとう。 –

+0

Thanx James、うまくいきますが、順不同のリストです。結果がipsが表示される回数(降順)で並べ替える必要がある場合はどうなりますか? – teo

0

ハッシュにIPアドレスを収集します。新しいマッチを見るたびに値を置き換えてください。最後に、ハッシュを出力します。

awk -F '[ [\t]+' '{ d[$1] = $2 } END { for (i in d) print i, d[i] }' access.log 
+0

コメントありがとうございます。タイプミス。 – tripleee

+1

@ lnianええ、単純な 'sub'を含めるか、' FS'を変更してそれを修正することができます。私は '-F'オプションを追加しました。 – tripleee

0
awk -F"[] []" '{a[$1]++;b[$1]=$3} END{for (i in a) print a[i],i,b[i]}' access.log 
+0

編集されました。ありがとう:) – 7171u

+0

このコードは問題を解決するのに役立つかもしれませんが、 _why_および/または_how_に関する追加のコンテキストを提供すると、 の質問はその長期的価値を大幅に改善します。 の制限事項と前提条件を含む説明を追加するには、回答を編集してください。 –

0

メモリにファイル全体を保存する必要はありません:

$ awk -F'[[ ]+' '$1!=p{ if (NR>1) print c, p, t; c=0} {c++; p=$1; t=$2} END{print c, p, t}' access.log 
3 192.168.0.147 02/Aug/2016:11:55:14 
1 192.168.0.122 08/Aug/2016:10:15:11 
関連する問題