我正在嘗試從具有多個字串和通配符的日志檔案中獲取匹配項。這就是日志的樣子
測驗日志
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' 匹配項,有人可以讓我知道我在這里缺少什么..嗎?
uj5u.com熱心網友回復:
這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
代碼演示
uj5u.com熱心網友回復:
建議grep:
grep -E "^(abc|ijk)\|" file.log
建議awk:
awk '/^(abc|ijk)\|/1' file.log
uj5u.com熱心網友回復:
使用您顯示的示例,請嘗試以下awk代碼。一旦列印了每個字串的第一次出現之一,這將退出程式,因此這不會讀取整個 Input_file。
awk -F'|' '
($1=="abc" || $1=="xyz") && arr[$1]==1{
count
print
}
count==2{ exit }
' Input_file
說明:為上述代碼添加詳細說明。
awk -F'|' ' ##Starting awk program from here and setting field separator as | here.
($1=="abc" || $1=="xyz") && arr[$1]==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.
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/442239.html
上一篇:jq帶單引號bash腳本
