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
-l
adiciona uma nova linha a cadaprint
e o-n
fará com que o script fornecido com-e
seja 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$1
a$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
-a
fará 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$o
se 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).