正则表达式仅匹配行尾的X个字符

时间:2012-03-15 17:25:53

标签: regex grep string-search

下面你将看到来自专有路由设备的32b内存转储中字符串'octeon'的一小段匹配。如您所见,它包含一些调整后的ASCII,从行尾开始延伸到16个字符,然后是4个32位字(当然每个8个字符),然后是地址偏移量。

000b27a0: 41646a75 7374206f 6374656f 6e5f6970    Adjust octeon_ip
000b2850: 73740a00 00000000 6f637465 6f6e5f72    st......octeon_r
000b2870: 5f73697a 65000000 6f637465 6f6e5f72    _size...octeon_r
000b2990: 6164696e 672e0a00 6f637465 6f6e5f72    ading...octeon_r
000b29b0: 785f7369 7a650000 6f637465 6f6e5f72    x_size..octeon_r
000b3050: 780a0000 00000000 6f637465 6f6e5f70    x.......octeon_p
000b3650: 6564204f 6374656f 6e206d6f 64656c0a    ed Octeon model.
000bade0: 20307825 71780a00 6f637465 6f6e5f6c     0x%qx..octeon_l
000bafd0: 696e6720 4f637465 6f6e2045 78656375    ing Octeon Execu
000bd710: 6564204f 6374656f 6e204d6f 64656c21    ed Octeon Model!
000bd950: 4f435445 4f4e2070 61737320 3120646f    OCTEON pass 1 do
000bda20: 6564206f 6374656f 6e206d6f 64656c3a    ed octeon model:

虽然这些数据包含一些有用的信息,但不幸的是,操作系统( HiveOS )没有尝试连续分配内存或者合并不同的堆(为什么它们应该?),所以绝大多数内存是一个贫瘠但尚未成为malloc的堆。

0004d6b0: 00000000 00000000 00000000 00000000    ................
0004d6c0: 00000000 00000000 00000000 00000000    ................
0004d6d0: 00000000 00000000 00000000 00000000    ................
0004d6e0: 00000000 00000000 00000000 00000000    ................
0004d6f0: 00000000 00000000 00000000 00000000    ................
0004d700: 00000000 00000000 00000000 00000000    ................
0004d710: 00000000 00000000 00000000 00000000    ................
0004d720: 00000000 00000000 00000000 00000000    ................
0004d730: 00000000 00000000 00000000 00000000    ................
0004d740: 00000000 00000000 00000000 00000000    ................
0004d750: 00000000 00000000 00000000 00000000    ................

我想快速有效地拉出一定大小的字符串,匹配一些任意的正则表达式模式([a-zA-z]浮现在脑海中) 您可能自然地认为运行常年对象转储检查最喜欢的“字符串”会产生结果,但md util是一个残酷的情妇 - 由于存在ascii编码的十六进制数组和&地址,它将每一行标识为包含'字符串'。

当然,我们都知道存在一个简单的脚本解决方案(for line in hexdump: f.write(line[-16:]) + grep '[A-z]' f)。

然而,有时我会感到震惊的是我应该更好地理解这些卑鄙的压迫性但却误解的正则表达式,而不是回到我易于使用的新奇的程序语言。在我用各种流编辑器和Awk脚本的正则表达式完全取代整个开发工具链生活之前,我真的觉得我无法开始发展真正的Unix领带。

如何在行尾的一定数量的字符内匹配[a-zA-z](在我的情况下,16) - 它似乎是一个非常精悍的结构,但+,?的所有组合? {16}以及在过去几分钟内对我有意义的其他事情很快就失败了。

3 个答案:

答案 0 :(得分:6)

使用“不匹配”开关-v

grep -v \.{16}$

这将删除以16点结尾的所有行。

以下是man文档:

  

-v, - invert-match
  反转匹配感,选择不匹配的行。

答案 1 :(得分:3)

这样做你想要的吗? “.{16}$

这将匹配行尾的任意16个字符。 $确保它与行尾相匹配。


仔细检查后,如果您只想提取并非所有句点的行,您可以使用此正则表达式:“{4}(.*?\w.*?)$ {4}之前有一个空格以便它匹配数字和行尾之间的分隔符。它在技术上并不“只有16个字符”,但考虑到数据集,它似乎确实提供了所需的输出。 (假设所需的输出是其中包含单词字符的任何行,即字母/数字/下划线。)

答案 2 :(得分:2)

过滤有趣线条的一个便宜技巧是用任何字符填充选择直到行结束。在这里,我选择一个不是一个点的字符,并且从行尾开始不超过15个字符。 (你使用posix正则表达式,所以你应该在\ {\}而不是{}之间写下重复量词。

grep '[^.].\{1,15\}$'

然后你可以用另一个grep来测试结果,或者你可以将这个想法改编成另一个正则表达式:

grep 'abc.\{1,13\}$'

将在最后16个字符中输入“abc”字符串。