El uso de múltiples declaraciones sed en la línea de comando

El uso de múltiples declaraciones sed en la línea de comando

Estoy usando el siguiente comando para generar una lista de direcciones IP en una línea con la declaración "IP de trabajo" después de 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$//'

La salida se ve así:

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 

Lo introduje en sed varias veces para que se viera como quería. ¿Existe un enfoque mejor que usar sed varias veces?

Respuesta1

No se trata solo de combinar múltiples sedcomandos (Jasen explicó esa parte en su respuesta). Puedes aprender un poco más:

cat file | sort ...

catno es necesario, ya que puedes dar sortun nombre de archivo, no es necesario hacerlo catantes, pero hazlo.

sort file | uniq -c | awk ...

uniq -cEsto elimina duplicados y agrega un recuento, pero como lo siguiente awkusa solo el tercer comlun, el recuento se elimina de todos modos. Puede eliminar -cy reemplazar el conjunto uniqcon la opción -ude sort:

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

Aquí estás haciendo un mal uso awkde cut -d" " -f 2, pero eres libre de hacerlo. Pero ahora también puedes continuar usando awko realizar ese paso sed. No es necesario cambiar de herramienta para una tarea que se puede realizar igualmente en cada herramienta:

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

Aquí empieza a ser extraño sin conocer el archivo de entrada. Pero si está agregando working IPa cada línea, elimínela para todas las del rango hasta que aparezca por primera vez, debería ser idéntico a agregar en todas las líneas excepto en la primera:

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

A continuación, pastese puede incluir fácilmente sedrecopilando las líneas en el espacio de retención y luego reemplazando las primeras líneas nuevas con un espacio en blanco, todas las demás con working IP. Al mismo tiempo, $ dse puede eliminar la última línea ( ), de modo que toda la línea de comando de una milla de largo con 6 comandos diferentes y 8 canales se queme en un sortsolo canal simple y un sedscript corto:

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

Idéntico resultado sin pasar toda la vida leyendo opciones en manpáginas y analizando lo que sucede en cada etapa.

Respuesta2

probablemente sea posible combinar las primeras tres llamadas sed de esta manera

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$//'

pero es difícil decirlo sin saber qué insumos son legales y qué resultados se desean.

información relacionada