具有多个字符串和通配符的 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

Code Demo

建议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.