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 的日志行以及 sessionscope、pagescope 或 requestscope 值之一与令牌值不匹配,我想解析日志文件并输出。例如,在我的示例中,第 2 行和第 4 行具有 MyClassName,并且在这两行中,第 4 行具有与 token 不同的 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价值

相关内容