O uso de múltiplas instruções sed na linha de comando

O uso de múltiplas instruções sed na linha de comando

Estou usando o comando abaixo para gerar uma lista de endereços IP em uma linha com a instrução "IP de trabalho" após cada IP

cat eciremoteExec1.txt | sort | uniq -c | awk -F " " '{print $3}' | sed 's/$/ working IP/'  | sed -e '0,/ working IP/ s/ working IP//' | sed '$ d' | paste -s -d ' ' | sed 's/working IP$//'

A saída é semelhante a esta:

147.123.41.112 working IP 129.138.70.113 working IP 173.230.45.54 working 
IP 133.218.250.56 working IP 136.203.152.128 working IP 117.22.29.254 
working IP 117.3.11.111 working IP 127.59.131.236 

Coloquei-o no sed várias vezes para que ficasse como eu queria. Existe uma abordagem melhor do que usar o sed várias vezes?

Responder1

Não se trata apenas de combinar vários sedcomandos (Jasen explicou essa parte em sua resposta). Você pode aprender um pouco mais:

cat file | sort ...

catnão é necessário, pois você pode fornecer sortum nome de arquivo, não é necessário catantes, mas faça

sort file | uniq -c | awk ...

uniq -cis remove duplicatas e adiciona uma contagem, mas como o seguinte awkusa apenas o terceiro comlun, a contagem é eliminada de qualquer maneira. Você pode descartar -ce substituir o todo uniqpela -uopção sort:

sort -u file | awk -F " " '{print $2}' | sed ...

Aqui você está fazendo uso indevido awkde for cut -d" " -f 2, mas é livre para fazê-lo. Mas agora você também pode continuar a usar awkou executar essa etapa sed. Não há necessidade de trocar de ferramenta para uma tarefa que pode ser realizada igualmente em cada ferramenta:

sort -u file | sed 's/[^ ]* *\([^ ]*\).*/\1 working IP/' ...

Aqui está começando a ficar estranho sem conhecer o arquivo de entrada. Mas se você estiver anexando working IPa cada linha, remova-o para todos no intervalo até a primeira ocorrência, deve ser idêntico ao acréscimo em todas as linhas, exceto a primeira:

sort -u file | sed 's/[^ ]* *//;s/ .*//;1!s/$/ working IP/'

Em seguida, o pastepode ser facilmente incluído sedcoletando as linhas no espaço de espera e posteriormente substituindo as primeiras novas linhas por um espaço em branco, todas as outras por working IP. Ao mesmo tempo, a remoção da última linha ( $ d) pode ser feita, de modo que toda a linha de comando com 6 comandos diferentes e 8 pipes se reduza a um simples sort, apenas um pipe e um sedscript curto:

sort -u file | sed 's/[^ ]* *//;s/ .*//;$!{H;1h;d;};x;s/\n/ /;s// working IP /g'

Resultado idêntico sem gastar uma vida inteira lendo opções nas manpáginas e analisando o que está acontecendo em cada etapa.

Responder2

provavelmente é possível combinar as três primeiras chamadas sed assim

cat eciremoteExec1.txt | sort | uniq -c | awk -F " " '{print $3}' |
   sed 's/$/ working IP/;s/ working IP//; $ d' | paste -s -d ' ' |
   sed 's/working IP$//'

mas é difícil dizer sem saber quais insumos são legais e quais resultados são desejados.

informação relacionada