$ 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
运行命令的结果替换上面的内容./showblock NUMBER
,其中NUMBER
是\2
上面的(第二组),sed
例如。 5285528
但我怎样才能找到、执行一个程序,然后同时替换/修改呢?
结果示例:
[ 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