GNU/Linux >> Tutoriales Linux >  >> Linux

¿Pasar la salida del comando anterior al siguiente como argumento?

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.

  1. Entrada estándar (stdin )
  2. 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:

  1. Pasando la entrada por stdin :

    ls | wc -l
    

    Esto contará las líneas en la salida de ls

  2. 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 del sed comando significa no imprimir líneas por defecto. El p al final de las s/// comando significa imprimir la línea si hubo un reemplazo. En resumen, el comando imprimirá algo solo si hubo una coincidencia.

Linux
  1. ¿Salida del comando "último"?

  2. ¿Cuál es la diferencia de obtener salida de comando usando `command` y $(command) en Shell?

  3. Con Bash después de "desplazarse" hasta un comando anterior... ¿Cómo pasar al siguiente en este historial?

  4. $_ Vs !$. ¿Último argumento del comando anterior y redirección de salida?

  5. ¿Cómo pasar la salida de un comando como argumento a otro?

¿Buscar texto en la salida del terminal?

¿Cómo acceder al último argumento de un comando comentado?

Guardar la salida de un comando desde la terminal de Debian a un archivo

¿Cómo puedo recordar el argumento del comando bash anterior?

Cómo pasar un argumento en Expect a través de la línea de comando en un script de shell

¿Ocultar la salida de un comando de shell solo en caso de éxito?