Tengo un comando que envía datos a stdout (command1 -p=aaa -v=bbb -i=4
).
La línea de salida puede tener el siguiente valor:
rate (10%) - name: value - 10Kbps
Quiero grep esa salida para almacenar esa 'tasa' (supongo que la tubería será útil aquí).
Y finalmente, me gustaría que esa tasa sea un valor de un parámetro en un segundo comando (digamos command2 -t=${rate}
)
Parece ser complicado de mi lado; Me gustaría saber mejor cómo usar tuberías, grep, sed, etc.
He probado muchas combinaciones como esa, pero me estoy confundiendo con estas:
$ command1 -p=aaa -v=bbb -i=4 | grep "rate" 2>&1 command2 -t="rate was "${rate}
Respuesta aceptada:
Estás confundiendo dos tipos muy diferentes de entradas.
- Entrada estándar (
stdin
) - Argumentos de línea de comando
Estos son diferentes, y son útiles para diferentes propósitos. Algunos comandos pueden recibir entradas de ambas formas, pero generalmente las usan de manera diferente. Tomemos por ejemplo el wc
comando:
-
Pasando la entrada por
stdin
:ls | wc -l
Esto contará las líneas en la salida de
ls
-
Pasar entrada por argumentos de línea de comando:
wc -l $(ls)
Esto contará líneas en la lista de archivos impreso por
ls
Cosas completamente diferentes.
Para responder a su pregunta, parece que desea capturar la tasa de la salida del primer comando y luego usar la tasa como un argumento de línea de comando para el segundo comando. Esta es una forma de hacerlo:
rate=$(command1 | sed -ne 's/^rate..([0-9]*)%.*/1/p')
command2 -t "rate was $rate"
Explicación del sed
:
- El
s/pattern/replacement/
el comando es reemplazar algún patrón - El patrón significa:la línea debe comenzar con "rate" (
^rate
) seguido de dos caracteres cualesquiera (..
), seguido de 0 o más dígitos, seguido de un%
, seguido del resto del texto (.*
) 1
en el reemplazo significa el contenido de la primera expresión capturada dentro de(...)
, por lo que en este caso los dígitos antes del%
firmar- El
-n
bandera delsed
comando significa no imprimir líneas por defecto. Elp
al final de lass///
comando significa imprimir la línea si hubo un reemplazo. En resumen, el comando imprimirá algo solo si hubo una coincidencia.