Webサーバーはログファイルを解析しており、ログエントリの1行にあるIPアドレスと同じログエントリの別の行に表示されるユーザー名を関連付けようとしています。
以下のログエントリがあるため、JSONの量が多いです。最初の部分は最初の行のユーザーIDで、その後には常に同じ形式の追加のログ情報が続き、最後の行はIPアドレス、その後に追加情報(含まれていません)が続きます。
awkは複数行を処理できますか?それとも、最初の項目をメモリ変数に入れて、2番目のフィールドが通過したときに出力することを検討する必要がありますか?
2017-08-11 17:12:53.763 TRACE 25528 --- [http-nio-10040-exec-16] c.b.g.s.SpnegoAuthenticationFilter : Principal [[email protected]] user ID =='pqr-xyz-coredev'
2017-08-11 17:12:53.764 TRACE 25528 --- [http-nio-10040-exec-16] c.b.g.s.SpnegoAuthenticationFilter : No GoP header [Gop-User] for [email protected]
2017-08-11 17:12:53.764 TRACE 25528 --- [http-nio-10040-exec-16] c.b.g.s.SpnegoAuthenticationFilter : User [pqr-xyz-coredev] details obtained.
{
"username": "pqr-xyz-coredev",
"password": "[PROTECTED]",
"country": null,
"department": null,
"title": null,
"email": null,
"enabled": true,
"accountNonExpired": true,
"credentialsNonExpired": true,
"accountNonLocked": true,
"grantedAuthorities": [
"GBSUD101 SUPPORT",
"RG OAG WE1-T1-01234 ADM"
]
}
2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] c.b.g.u.s.RequestResponseLoggingFilter : 936 URI: /data/load/REF.SWE.RUN.ALL.M.KBD/2017-08-11 GET
2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] c.b.g.u.s.RequestResponseLoggingFilter : 936 HEADER 'host': rsadffs199.abc1.com:10040
2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] c.b.g.u.s.RequestResponseLoggingFilter : 936 HEADER 'user-agent': PycURL/7.43.0 libcurl/7.52.1 WinSSL zlib/1.2.8
2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] c.b.g.u.s.RequestResponseLoggingFilter : 936 HEADER 'accept': */*
2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] c.b.g.u.s.RequestResponseLoggingFilter : 936 AUTHORIZATION: hash not displayed
2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] c.b.g.u.s.RequestResponseLoggingFilter : 936 PARAM 'endDate': 2099-12-31
2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] c.b.g.u.s.RequestResponseLoggingFilter : 936 PARAM 'startDate': 1900-01-01
2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] c.b.g.u.s.RequestResponseLoggingFilter : 936 REMOTE ADDRESS: 101.16.75.75
答え1
以下を試してくださいawk
。
awk -F"[=':]" '/user ID/{userID=$(NF-1)} /REMOTE ADDRESS/{print userID"," $NF}' `infile.txt
出力:
pqr-xyz-coredev, 101.16.75.75
答え2
perl -F"\h+|'" -lane '
/\huser\h+ID\h/ and $a = $F[-1];
/\hREMOTE\h+ADDRESS:\h/ and print "$a $F[-1]";
' log.file
Perl
オプション:-F"\h+|'"
これは、一連の水平スペースまたは一重引用符文字で現在の行を分割します。これにより、私たちが探している情報を常に最後のフィールドに見つけることができます。-l
これは改行に設定され、ORS
またIRS
改行に設定されます。-a
オプションで提供されるフィールド区切り文字、-F
またはデフォルトでスペースに基づいて入力レコードを分割します。現在のレコードで区切られたフィールドは配列に保存されます@F
。-n
これは、暗黙的な入力ファイルの読み取りループを設定し、レコードをstdoutに自動印刷することを無効にします。
user ID
両側に水平方向の空白がある行に会うと、最後のフィールドに保存されているユーザーID(たとえば)が記憶され続けます$F[-1]
。- 地平線に出会うと、
REMOTE ADDRESS:
両側は地平線に囲まれています。空白がある場合は、以前に保存されたユーザーIDとIPアドレスを含む行の最後のフィールドを印刷し続けます。
結果:
pqr-xyz-coredev 101.16.75.75