ファイル内の特定の行からパターンをgrepし、同じ行で一致するものが見つかった場合は、その行を出力します。

ファイル内の特定の行からパターンをgrepし、同じ行で一致するものが見つかった場合は、その行を出力します。

次の内容を含む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

関連情報