awkスクリプト出力から文字列を含まない行を除外する方法は?

awkスクリプト出力から文字列を含まない行を除外する方法は?

通常、スクリプトに慣れておらず、さまざまな項目の項目を含むログを調べるスクリプトを作成してきました。私が興味を持っているのは、ユーザーの活動(ウェブサイトのログイン、クリックなど)を記録する項目です。

私は(多くの助けを借りて)次のawkスクリプトを一緒にまとめて、ユーザー名を含まない行に出力を印刷することを除いて、ほぼ完全に動作します。除外したいのに方法が見つかりません(簡単だと思いました)。

コードは次のとおりです。

awk '
{       split($3, d, "@")
        match($0, /"username":"[^"]*"/)
        user = substr($0, RSTART + 12, RLENGTH - 13)
        c[d[1] OFS user]++
}
END {   for(i in c)
                printf("%4d %s\n", c[i], i)
}' mycompany.log | sort -k3,3 -k2,2

出力からユーザー名を含まないすべての行を除外する方法がわかりません。

以下は、ユーザー名を含む行の例です。

qtp111659197-5776 - 05-26@09:37:34:240 INFO  (TimingInfoProxy.java:41)     - com.mycompany.api.ApiHandler-0>getUniqueDataBySource(data,{"has_values":false,"last_event_triggered":"","user_info":{"username":"[email protected]","orgid":"69d467a7-9786-47e1-9c12-bb40f9bfc65d","ip":"127.0.0.1"},"date_range":{"min_date":"","start_date":"","end_date":"","trending_start_date":"","trending_end_date":""},"terms":{"and_filtering":[]}},) 

以下は、次のない行の簡単な例です。

main - 05-22@10:05:21:387 INFO  (ContextLoader.java:313)     - Root WebApplicationContext: initialization completed in 9519 ms

ベストアンサー1

すでに別のシェルコマンドでパイプしているので、grepを使いましょう。

awk '
{
...
}' mycompany.log | grep -f '"username:"' | sort -k3,3 -k2,2

(ユーザー名タグは絶対に変更されないため、-fを使用します。)

編集:これが最も確実な方法です。確かに「より良い」方法はawk自体を使用することです。

awk '
/\"username\":/ {
...
}' mycompany.log | sort -k3,3 -k2,2

おすすめ記事