ポート33001のlocalhostからデータを受信し、さまざまなAPIバージョンが要求された回数を見つけて画面に印刷するスクリプトを開発します。
ログの例は次のとおりです。
172.32.11.121 736443 /api/2.3
98.134.54.184 182294 /api/2.3
172.32.11.121 736443 /api/2.3/security
203.44.122.18 397832 /api/3.0
172.32.11.121 736443 /api/2.3
98.134.54.184 182294 /api/3.0
172.32.11.121 736443 /api/2.3/logging
172.32.11.121 736443 /api/2.3
71.11.139.205 291187 /api/2.3
172.32.11.121 736443 /api/3.0/security
98.134.54.184 182294 /api/2.3
71.11.139.205 397832 /api/3.0/logging
最初のフィールドはIPアドレス、2番目のフィールドはユーザーID、最後のフィールドはリソースパスです。
答え1
ファイルのデータを想定してくださいindata
。
$ awk '{ ++c[$NF] } END { for (i in c) print c[i], i }' indata
1 /api/2.3/logging
1 /api/3.0/security
6 /api/2.3
2 /api/3.0
1 /api/3.0/logging
1 /api/2.3/security
スクリプトawk
は、最後の列のデータが表示された回数を追跡し、最後にこの情報の要約を印刷します。
バージョンのみをインポートする数字、使用-F '/'
し$NF
、に変えなさい$3
。
または:
$ cut -d ' ' -f 3 indata | sort | uniq -c
6 /api/2.3
1 /api/2.3/logging
1 /api/2.3/security
2 /api/3.0
1 /api/3.0/logging
1 /api/3.0/security
これにより、データからスペースで区切られた3番目の列が削除され、ソートされます。uniq -c
次に、各固有項目の発生回数を計算します。
このバリアントのバージョン番号のみを取得するには、-d ' '
呼び出しからに置き換えます。-d '/'
cut
答え2
フルパスではなくバージョンのみに興味があるとします。
$ awk -F/ '{count[$3]++} END {for (v in count) print v, count[v]}' file
2.3 8
3.0 4
分割のフィールドである/
バージョン番号は、すべての行の3番目のフィールドのようです。