文字列を含む行を変更するために、文字列を引数として渡した他のプログラムの出力をどのように使用できますか?

文字列を含む行を変更するために、文字列を引数として渡した他のプログラムの出力をどのように使用できますか?
$ cat sample.dmesg.log | sed -re 's/(READ block )([0-9]+)( on xvda3.*$)/\1\2\3 XXX/g'
[ 6031.953619] sysctl(20774): READ block 5285528 on xvda3 (32 sectors) XXX
[ 6031.954317] sysctl(20774): READ block 5285768 on xvda3 (8 sectors) XXX
[ 6031.954598] sysctl(20774): READ block 5285648 on xvda3 (120 sectors) XXX
[ 6031.954617] sysctl(20774): READ block 5285776 on xvda3 (24 sectors) XXX
[ 6031.955482] sysctl(20774): READ block 5285560 on xvda3 (88 sectors) XXX
[ 6031.955699] sysctl(20774): READ block 4473568 on xvda3 (8 sectors) XXX
[ 6031.955730] sysctl(20774): READ block 4473584 on xvda3 (16 sectors) XXX
[ 6031.955787] sysctl(20774): READ block 4749496 on xvda3 (224 sectors) XXX

たとえば、各入力行について、上記の内容を上記のXXXコマンド実行結果(2番目のグループ)に置き換えたいと思います。 5285528 ./showblock NUMBERNUMBER\2sed

しかし、どのようにプログラムを見つけて実行し、同時に交換/修正することができますか?

結果の例:

[ 6031.953619] sysctl(20774): READ block 5285528 on xvda3 (32 sectors) Path: /usr/lib64/libgpg-error.so.0.24.2

同じコマンドsedまたは別のコマンドを使用してこれを実行できることを願っています。一つ注文する?

この質問をより一般的で有用にするためにどのように変更するかを知っている人がいる場合は、そうします。

つまり、正規表現/正規表現のマッチング中に外部プログラムを実行する方法は?

ベストアンサー1

Perlを試してみてください:

perl -pe '
    s{(READ block) (\d+) (on xvda3.*$)}
     {join " ",$1, $2, $3, qx(./showblock $2)}e
' sample.dmesg.log

末尾の改行を削除するには:

     { chomp($out = qx(./showblock $2)); join " ", $1, $2, $3, $out }e

おすすめ記事