具有多个字符串和通配符的 Grep
Grep with multiple strings and wildcard
我正在尝试从包含多个字符串和通配符的日志文件中获取匹配项。这是日志的样子
test.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'
的行中获取具有 sessionId 的日志行
我试过的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"]}
in pat && /:sessionId=/ {print; delete pat[]}' file.log
abc|07Jan2016:sessionId=F4DF
ijk|06Jan2016:sessionId=CF38
建议grep
:
grep -E "^(abc|ijk)\|" file.log
建议 awk
:
awk '/^(abc|ijk)\|/1' file.log
使用您显示的示例,请尝试以下 awk
代码。一旦打印出每个字符串的第一次出现,这将从程序中退出,因此这不会读取整个 Input_file.
awk -F'|' '
(=="abc" || =="xyz") && ++arr[]==1{
count++
print
}
count==2{ exit }
' Input_file
说明:为以上代码添加详细说明。
awk -F'|' ' ##Starting awk program from here and setting field separator as | here.
(=="abc" || =="xyz") && ++arr[]==1{ ##Checking condition if 1st field is abc OR xyz AND their respective index in array arr is ONLY 1.
count++ ##Increase count with 1 here.
print ##Printing current line here.
}
count==2{ exit } ##Checking condition if count is 2 then exit from program.
' Input_file ##Mentioning Input_file name here.
我正在尝试从包含多个字符串和通配符的日志文件中获取匹配项。这是日志的样子
test.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'
的行中获取具有 sessionId 的日志行我试过的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"]}
in pat && /:sessionId=/ {print; delete pat[]}' file.log
abc|07Jan2016:sessionId=F4DF
ijk|06Jan2016:sessionId=CF38
建议grep
:
grep -E "^(abc|ijk)\|" file.log
建议 awk
:
awk '/^(abc|ijk)\|/1' file.log
使用您显示的示例,请尝试以下 awk
代码。一旦打印出每个字符串的第一次出现,这将从程序中退出,因此这不会读取整个 Input_file.
awk -F'|' '
(=="abc" || =="xyz") && ++arr[]==1{
count++
print
}
count==2{ exit }
' Input_file
说明:为以上代码添加详细说明。
awk -F'|' ' ##Starting awk program from here and setting field separator as | here.
(=="abc" || =="xyz") && ++arr[]==1{ ##Checking condition if 1st field is abc OR xyz AND their respective index in array arr is ONLY 1.
count++ ##Increase count with 1 here.
print ##Printing current line here.
}
count==2{ exit } ##Checking condition if count is 2 then exit from program.
' Input_file ##Mentioning Input_file name here.