下面您将看到来自专有路由设备的 32b 内存转储中字符串 'octeon' 的一小段匹配。如您所见,它包含一些调整后的 ASCII,从行尾扩展到 16 个字符,然后是四个 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} 以及在过去几分钟内对我来说有意义的其他方式很快就失败了。
最佳答案
使用“不匹配”开关 -v
:
grep -v \.{16}$
这将删除所有以 16 点结尾的行。
这是
man
它的文档:-v, --invert-match
Invert the sense of matching, to select non-matching lines.
关于regex - 正则表达式只匹配行尾的 X 个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9724956/