
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 sed
comandos (Jasen explicou essa parte em sua resposta). Você pode aprender um pouco mais:
cat file | sort ...
cat
não é necessário, pois você pode fornecer sort
um nome de arquivo, não é necessário cat
antes, mas faça
sort file | uniq -c | awk ...
uniq -c
is remove duplicatas e adiciona uma contagem, mas como o seguinte awk
usa apenas o terceiro comlun, a contagem é eliminada de qualquer maneira. Você pode descartar -c
e substituir o todo uniq
pela -u
opção sort
:
sort -u file | awk -F " " '{print $2}' | sed ...
Aqui você está fazendo uso indevido awk
de for cut -d" " -f 2
, mas é livre para fazê-lo. Mas agora você também pode continuar a usar awk
ou 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 IP
a 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 paste
pode ser facilmente incluído sed
coletando 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 sed
script 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 man
pá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.