linux - 带有多个字符串和通配符的 Grep

标签 linux awk grep

我正在尝试从具有多个字符串和通配符的日志文件中获取匹配项。这就是日志的样子

测试.log

abc|07Jan2016:sessionId=F4DF
<<random log lines>>
def|08Jan2016:sessionId=5415
<<random log lines>>
abc|08Jan2016:sessionId=F4DF
<<random log lines>>
xyz|09Jan2016:sessionId=F3D2
<<random log lines>>
ijk|06Jan2016:sessionId=CF38

我期待的结果

abc|07Jan2016:sessionId=F4DF
ijk|06Jan2016:sessionId=CF38

如您所见,我只想从字符串匹配“abc”和“ijk”的行中获取具有 sessionIds 的日志行

我尝试过的 grep 命令

grep -m 1 'abc.*sessionId\|ijk.*sessionId' test.log

我得到的结果

ijk|06Jan2016:sessionId=CF38

grep 不是在寻找与字符串“abc”的匹配,而是在寻找与通配符“.*sessionId”匹配的“ijk”。有人可以让我知道我在这里缺少什么吗?

最佳答案

这个awk可以解决这个问题:

awk 'BEGIN {FS="\\|"; pat["abc"]; pat["ijk"]}
$1 in pat && /:sessionId=/ {print; delete pat[$1]}' file.log

abc|07Jan2016:sessionId=F4DF
ijk|06Jan2016:sessionId=CF38

Code Demo

关于linux - 带有多个字符串和通配符的 Grep,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71428367/

相关文章:

regex - Linux grep - 从 x 到 y 中的文件打印数字

perl - grep 变量并给出信息输出

regex - 如何 grep 查找包含单引号和双引号的文本?

linux - 将计数器参数传递给 awk 脚本

linux - sbull ldd3 示例驱动程序卡住

c - 使用 open 读取仅使用一个值的文本文件并尝试锁定该文件

linux - 使用 Sed 将旧时间戳替换为当前时间戳

linux - 期望:检索命令的返回码

linux - awk 解析输出并提取值

linux - 如何使用 bash 脚本计算一个单词中出现次数最多的 3 个字母序列