listar a parte “intermediária” de uma entrada no final da saída no awk

1

Isto é em relação a um hostfile.

ENTRADA:

1.2.3.4 foooo00001 foo001 # AIX bar0003 NOSLS NOSLS NOCOMMENT
2.3.4.1 foooo00002 foo002 fooo0002 # Linux bar0003 NOSLS NOSLS NOCOMMENT

OUTPUT:

echo "$INPUT" | awk '{print $(NF-3)";"$2";"$1";"$(NF-2)";"$(NF-1)}'
bar0003;foooo00001;1.2.3.4;NOSLS;NOSLS
bar0003;foooo00002;2.3.4.1;NOSLS;NOSLS

mas precisamos dessa saída:

echo "$INPUT" | awk SOMEMAGIC
bar0003;foooo00001;1.2.3.4;NOSLS;NOSLS;foo001
bar0003;foooo00002;2.3.4.1;NOSLS;NOSLS;foo002;fooo0002

Pergunta: Como podemos modificar o awk para acrescentar os aliases (o valor pode variar, um host pode ter zero, um, dois, etc.)?

Espaço é o delimitador e os aliases são depois dos nomes de host e sempre terminam com "#".

    
por freaking-good-question 31.03.2015 / 14:06

2 respostas

1

Se você gosta de awk try

echo "$INPUT" | \
awk -v OFS=';' '
{for(i=4;$i!="#";i++)
     $3=$3 OFS $i
 print $(NF-3),$2,$1,$(NF-2),$(NF-1),$3}'

O mesmo que você pode fazer com o GNU sed

echo "$INPUT" | \
sed -r 's/(\S*)( \S* )(.*) # \S* (\S*)( .* )\S*//;s/ /;/g'
    
por 31.03.2015 / 14:58
1

Você pode tentar isso:

echo "$INPUT" | awk '{ for (i = 1; i < NF; i++) { if ($i ~ /#/) { pos = i; break; } } } { for (i = 3; i < pos; i++) s = s";"$i; print $(NF-3)";"$2";"$1";"$(NF-2)";"$(NF-1)s }' 
    
por 31.03.2015 / 14:25

Tags