awk匹配字符串反斜杠问题:筛选特定路径并输出路径与SHA1
问题与解决方案
问题场景
给定日志文件内容:
- 2023-12-24T07:00:00 2152 4078 information.cp 253 TEST Verifying certificate completed for 'C:\Windows\Temp\test file1.exe', SHA1: 'efdfe54bce9edc227bee03bc61cbfaa8b3c754ee' lookup took: '57969' nanoseconds,
- 2023-12-24T08:00:00 2152 4078 information.cp 253 TEST Verifying certificate completed for 'C:\Microsoft\testfile2.exe', SHA1: 'ffdfe54bce9edc227bee03bc61cbfaa8b3c754dd' lookup took: '57970' nanoseconds,
需求:仅提取文件路径包含Microsoft或Windows\Temp的条目,输出对应文件路径和SHA1值。
原执行命令及报错:
awk -F\' '($2 ~ (Microsoft || Windows\\Temp) {print $2, $4}' file
报错信息:
awk: syntax error at source line 1
context is
$2 ~ (Microsoft || >>> Windows\ <<< \Temp) {print $2, $4}
awk: bailing out at source line 1
错误原因
- 正则语法错误:awk多条件匹配需用
/pattern1|pattern2/格式,不能直接用(A || B)的写法; - 反斜杠转义问题:shell和awk层面都需要对反斜杠转义,原命令的转义层级不足;
- 括号不匹配:原命令中
($2 ~ ...)缺少闭合右括号。
修正后的命令
方案1:正则匹配(推荐)
awk -F\' '$2 ~ /Microsoft|Windows\\\\Temp/ {print $2, $4}' file
-F\':以单引号为分隔符,确保$2对应文件路径、$4对应SHA1值;/Microsoft|Windows\\\\Temp/:\\\\经过shell转义后传递给awk为\\,awk正则中再转义一次得到\,匹配日志里的路径分隔符;- 去掉冗余括号,简化语法。
方案2:字符串匹配(更直观)
awk -F\' 'index($2, "Microsoft") != 0 || index($2, "Windows\\Temp") != 0 {print $2, $4}' file
index($2, "str")返回字符串str在$2中的起始位置,不为0则表示存在该子串;Windows\\Temp经shell转义后,awk中得到Windows\Temp,直接匹配目标路径。
执行结果
C:\Windows\Temp\test file1.exe efdfe54bce9edc227bee03bc61cbfaa8b3c754ee C:\Microsoft\testfile2.exe ffdfe54bce9edc227bee03bc61cbfaa8b3c754dd
内容的提问来源于stack exchange,提问作者ghostrider
相关产品推荐
相关产品推荐

