我有一个文件,可以说是 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
价值