我正在尝试使用SED命令在文件中查找模式。 不知怎的,我的正则表达式不起作用,虽然我希望它可以工作。
详细说明: 文本文件aaa.log包含以下数据:
007ba20: fa2e1438 fa3e1438 d1af9a57 d0000000 8...8.>.W.......
007ba30: d0006813 d3af9a17 d2000009 d200001d .h..............
007ba40: d1af9a52 d0004a43 d000505f d3af9b12 R...CJ.._P......
007ba50: d2000009 d20000d3 04100012 04404350 ............PC@.
007ba60: 0440004a 04100001 059a4393 059a0002 J.@......C......
007ba70: 04100005 04100000 04100000 059a4153 ............SA..
007ba80: 059a4154 059a4162 059c40fc 04100012 TA..bA...@......
007ba90: 04404350 0440004a 04100001 059c4392 PC@.J.@......C..
007baa0: 059c40f5 0440a350 0440004a 04404350 .@..P.@.J.@.PC@.
007bab0: 0440004a 04400068 04400000 04100000 J.@.h.@...@.....
007bac0: 04100000 059c410f 059e4193 03a00001 .....A...A......
007bad0: 03a04255 03a04292 03a04294 02400000 UB...B...B....@.
007bae0: 02408009 02100000 03a04215 028005b1 ..@......B......
我的目的是跟踪所有8个字符的模式,从d1和d0开始,后跟6个任意字符,然后是空格
因此,我已经形成了以下一行:
p=".*(d1.{6}|d0.{6})[[:space:]].*"; cat aaa.log | tr '\r\n' ' ' | sed -rn "s/$p$p$p$p$p$p/\1 \2 \3 \4 \5 \6\n/p"
正如你在aaa.log中看到的那样,有六组$ p存在。确实找到了输出:
d1af9a57 d0000000 d0006813 d1af9a52 d0004a43 d000505f
但是因为aaa.log文件中没有第7个$ p模式,所以当我使用以下语法时:
p=".*(d1.{6}|d0.{6})[[:space:]].*"; cat aaa.log | tr '\r\n' ' ' | sed -rn "s/$p$p$p$p$p$p$p/\1 \2 \3 \4 \5 \6 \7\n/p"
失败并且不打印任何输出。
我假设由于模式7不存在而不打印输出。
任何想法如何将匹配的组打印为输出,即使找不到某些模式?
答案 0 :(得分:1)
grep -o "d1[^ ]\{6\}\|d0[^ ]\{6\}"
怎么办?
答案 1 :(得分:0)
sed -rn '/ d[01][0-9a-f]{6} / s/\r//p' aaa.log
sed -rn '/^[[:xdigit:]]{7}:.*[[:space:]]d[01][[:xdigit:]]{6}[[:space:]].*.{16}$/ s/\r//p' aaa.log