次の内容を含むtemp.logというファイルがあります。
blahblah SomeOtherClassName blahblahblah
blahblah MyClassName blah blah blah userId:[6729223726254951za],key:[09809890980980908d0e6],token:[0238234234-3948-4d9],SessionScope:[0238234234-3948-4d9],PageScope:[0238234234-3948-4d9],RequestScope:[0238234234-3948-4d9], requestUrl:/blah/blah/blah
blahblah SomeOtherClassName blahblahblah
blahblah MyClassName blah blah blah userId:[6729223726254951za],key:[09809890980980908d0e6],token:[0238234234-3948-4d9],SessionScope:[1111111-3948-4d9],PageScope:[0238234234-3948-4d9],RequestScope:[0238234234-3948-4d9], requestUrl:/blah/blah/blah
MyClassNameを含むログ行とsessioncope、pagescope、またはrequestscopeのいずれかの値がトークン値と一致しない場合は、ログファイルを解析して出力したいと思います。たとえば、私の例では、2行と4行にMyClassNameがあり、これら2行のうち4行にトークンとは異なるSessionScope値があるため、4行を出力する必要があります。 grepおよび逆参照オプションのために困難を経験しています。
答え1
トークンをグループとしてキャプチャし、逆参照を使用してテストします。
$ grep 'MyClassName' log |
grep -vE 'token:(\[[[:xdigit:]-]+\]),SessionScope:\1,PageScope:\1,RequestScope:\1'
blahblah MyClassName blah blah blah userId:[6729223726254951za],key:[09809890980980908d0e6],token:[0238234234-3948-4d9],SessionScope:[1111111-3948-4d9],PageScope:[0238234234-3948-4d9],RequestScope:[0238234234-3948-4d9], requestUrl:/blah/blah/blah
答え2
愚かな解決策:
awk -v FPAT='\\[[^][[:space:]]+\\]' 'NF>5 && ($3!=$4 || $3!=$5 || $3!=$6){ print $0 }' logfile
出力:
blahblah MyClassName blah blah blah userId:[6729223726254951za],key:[09809890980980908d0e6],token:[0238234234-3948-4d9],SessionScope:[1111111-3948-4d9],PageScope:[0238234234-3948-4d9],RequestScope:[0238234234-3948-4d9], requestUrl:/blah/blah/blah
詳細:
-v FPAT='\\[[^][[:space:]]+\\]'
- フィールド値のパターン定義(例[0238234234-3948-4d9]
:)($3!=$4 || $3!=$5 || $3!=$6)
- 決定的な内容がある場合鍵矛盾トークン$3
値