Como alterar a linha em que uma string é encontrada com a saída de outro programa para o qual você passa essa string como um argumento?

0
$ cat sample.dmesg.log | sed -re 's/(READ block )([0-9]+)( on xvda3.*$)/ 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

Para cada linha de entrada, desejo substituir o XXX acima pelo resultado da execução do comando ./showblock NUMBER , em que NUMBER é (segundo grupo) no sed acima, por exemplo. 5285528

Mas como posso encontrar, executar um programa e substituir / modificar ao mesmo tempo?

Resultado da amostra:

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

Espero que isso possa ser feito com o mesmo comando sed ; ou algum outro um comando?

Se alguém souber como reformular mais essa pergunta para que seja mais genérica e útil, faça isso.

Em outras palavras: Como executar um programa externo no meio da correspondência regex / regexp?

    
por Marcus Linsner 06.09.2018 / 21:00

1 resposta

2

Experimente o perl:

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

Para remover a nova linha à direita, você pode fazer

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

Tags