8

以下に、独自のルーティング デバイスからの 32b メモリ ダンプ内の文字列 'octeon' からの一致の小さな抜粋を示します。ご覧のとおり、行末から 16 文字までの調整された ASCII、次に 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]頭に浮かぶ) 自然に、永続的なオブジェクト ダンプ検査のお気に入りの 'strings' を実行すると結果が得られると考えるかもしれませんが、mdユーティリティは残酷な愛人 -- ASCII コード化された 16 進数のバンクとアドレスが存在するため、すべての行が「文字列」を含むものとして識別されます。

for line in hexdump: f.write(line[-16:])確かに、簡単なスクリプト ソリューション ( + )が存在することは誰もが知っていますgrep '[A-z]' f

しかし、ときどき、自分の使いやすい新しいプログラミング言語にこっそり戻るよりも、これらのひどく抑圧的でありながら誤解されている正規表現をよりよく理解するようになるべきだという気持ちに襲われます。開発ツールチェーン全体をさまざまなストリーム エディターと Awk スクリプトの正規表現に完全に置き換えるまでは、本当の Unix の首ひげを生やし始めることはできないと本当に感じています。

[a-zA-z]行末から特定の数の文字 (私の場合は 16) 内でどのように一致するのですか? {16} と、それ以外の場合、ここ数分で私にとって意味のあることはすぐに失敗しました。

4

3 に答える 3

6

「一致しない」スイッチを使用します-v

grep -v \.{16}$

これにより、16 ドットで終わるすべての行が削除されます。

そのmanドキュメントは次のとおりです。

-v, --invert-match 一致
の意味を反転して、一致しない行を選択します。

于 2012-03-16T23:15:42.953 に答える
4

これはあなたが望むことをしますか?" .{16}$"

これは、行末から任意の 16 文字に一致します。は$、行末と一致することを保証します。


詳細な検査の後、すべてのピリオドではない行のみを抽出する場合は、次の正規表現を使用できます: " {4}(.*?\w.*?)$" の前にスペースがあり{4}、数字と行末の間の区切り文字と一致します。技術的には「わずか 16 文字」ではありませんが、データ セットを考えると、目的の出力が得られるように見えます。(目的の出力が、文字/数字/アンダースコアである単語文字を含む行であると仮定します。)

于 2012-03-15T17:34:14.077 に答える
2

興味深い行をフィルタリングする簡単な方法は、選択範囲を行末まで任意の文字で埋めることです。ここでは、ポイントではなく、行末から 15 文字以内の文字を選択します。(posix regex を使用するため、{ } ではなく \{ \} の間に繰り返し量指定子を記述する必要があります)

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

次に、結果を別の grep でパイプしてテストするか、アイデアを別の正規表現に適合させることができます。

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

最後の 16 文字に文字列 "abc" が一致します。

于 2012-03-16T22:46:05.647 に答える