Ниже вы увидите небольшой отрывок совпадений из строки 'octeon' в дампе памяти объемом 32 байта, полученном от проприетарного устройства маршрутизации. Как вы можете видеть, он содержит несколько скорректированных символов 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) не пытается выделять память непрерывно или объединять разрозненные кучи (да и зачем?), поэтому подавляющее большинство память — это бесплодная куча, которую еще предстоит выделить.
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
— жестокая хозяйка — из-за наличия ASCII-кодированных шестнадцатеричных банков и адресов она идентифицирует каждая строка содержит «строку».
Конечно, все мы знаем, что существует тривиальное скриптовое решение ( для строки в шестнадцатеричном дампе: f.write(line[-16:])
+ grep '[Az]' f
).
Тем не менее, иногда меня поражает чувство, что я должен лучше понять эти подлые угнетающие, но неправильно понятые регулярные выражения, а не возвращаться к моим простым в использовании новомодным языкам программирования. Я действительно чувствую, что не смогу начать выращивать настоящую бороду Unix, пока полностью не заменю всю свою набор инструментов разработкиразличными потоковыми редакторами и регулярными выражениями сценариев Awk.
Как сопоставить [a-zA-z]
в пределах определенного количества символов от конца строки (в моем случае 16) — это кажется довольно содержательной конструкцией, но все комбинации +, ? {16} и в остальном, что имело смысл для меня в последние несколько минут, быстро потерпели неудачу.