
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 sed
comandos (Jasen explicó esa parte en su respuesta). Puedes aprender un poco más:
cat file | sort ...
cat
no es necesario, ya que puedes dar sort
un nombre de archivo, no es necesario hacerlo cat
antes, pero hazlo.
sort file | uniq -c | awk ...
uniq -c
Esto elimina duplicados y agrega un recuento, pero como lo siguiente awk
usa solo el tercer comlun, el recuento se elimina de todos modos. Puede eliminar -c
y reemplazar el conjunto uniq
con la opción -u
de sort
:
sort -u file | awk -F " " '{print $2}' | sed ...
Aquí estás haciendo un mal uso awk
de cut -d" " -f 2
, pero eres libre de hacerlo. Pero ahora también puedes continuar usando awk
o 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 IP
a 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, paste
se puede incluir fácilmente sed
recopilando 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, $ d
se 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 sort
solo canal simple y un sed
script 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 man
pá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.