Você também pode tentar o Perl:
diff file1 file2 |
perl -lne 'if(/^(.).*?#(.+?)#.*?:\s*(\d+).*(".+?")/){
$1 eq ">" ? print "Hostname=$2; old=$o new=$3, Name=$4" : ( $o=$3 )}'
Explicação
- O
-ladiciona uma nova linha a cadaprinte o-nfará com que o script fornecido com-eseja aplicado a cada linha do arquivo de entrada. - A expressão regular identificará o primeiro caractere (
^.), a primeira cadeia entre#(#(.+?)#),:seguido por 0 ou mais espaço em branco e um conjunto de números (:\s*(\d+)) e a última string citada na linha (.*(".+?")). Os parênteses fazem com que estes sejam salvos como$1a$4. -
foo ? bar : baz: esta é uma construção C presente em muitos idiomas. É a abreviação de "se foo é verdade, então faça bar, senão faça baz". Então, se$1, o primeiro caractere da linha que foi salvo pela operação de correspondência anterior, for>, então imprimiremos e, se não for, salvaremos o terceiro padrão correspondente como$o.
Ou
diff file1 file2 |
perl -lane '$o = $F[4] if /^</; $F[1]=~s/#(.*)#.*/$1/;
print "Hostname=$F[1]; old=$o new=$F[4], Name=$F[8]" if />/'
Explicação
- O
-afará o Perl dividir automaticamente cada linha de entrada no espaço em branco e salvá-la no array@F. -
$o = $F[4] if /^</;: isso salva o quinto campo como$ose o primeiro caractere da linha for<. -
$F[1]=~s/#(.*)#.*/$1/;: isso removerá tudo, exceto o nome do host do segundo campo ($F[1], matrizes são numeradas de 0).