Está 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 información de ambas maneras, pero generalmente los usan de manera diferente. Tome por ejemplo el wc
comando:
Pasando 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 impresos porls
Cosas completamente diferentes.
Para responder a su pregunta, parece que desea capturar la velocidad de la salida del primer comando y luego usar la velocidad como argumento de línea de comando para el segundo comando. Aquí hay una forma de hacer eso:
rate=$(command1 | sed -ne 's/^rate..\([0-9]*\)%.*/\1/p')
command2 -t "rate was $rate"
Explicación de sed
:
- El
s/pattern/replacement/
comando es reemplazar algún patrón
- El patrón significa: la línea debe comenzar con "rate" (
^rate
) seguido de dos caracteres ( ..
), seguido de 0 o más dígitos, seguido de a %
, seguido del resto del texto ( .*
)
\1
en el reemplazo significa el contenido de la primera expresión capturada dentro \(...\)
, por lo que en este caso los dígitos antes del %
signo
- La
-n
bandera del sed
comando significa no imprimir líneas por defecto. Al p
final del s///
comando significa imprimir la línea si hubo un reemplazo. En resumen, el comando imprimirá algo solo si hubo una coincidencia.
Para simular la salida de
command1
Estoy usando esta declaración de eco:Una prueba rápida:
Eso está bien, así que analicemos:
Entonces obtenemos la línea que queremos, pasemos
command1
eso acommand2
:Espero
"rate was "$(command1 | grep 'rate')
concatenar automáticamente. Si eso no funciona debido al espacio en blanco, debería poder pasar la entrada de esta manera:fuente
Prueba esto usando grep & pcre :
fuente
La primera tarea es extraer la tasa de esa línea. Con GNU grep (Linux no integrado o Cygwin), puede usar la
-o
opción. La parte que desea es la que contiene solo dígitos, seguida de un%
signo. Si no desea extraer el%
propio, necesita un truco adicional: una aserción anticipada de ancho cero , que no coincide con nada, pero solo si no se sigue nada%
.Otra posibilidad es usar sed. Para extraer una parte de una línea en sed, use el
s
comando, con una expresión regular que coincida con la línea completa (comenzando^
y terminando con$
), con la parte para retener en un grupo (\(…\)
). Reemplace toda la línea por el contenido de los grupos que desea conservar. En general, pase la-n
opción de desactivar la impresión predeterminada y coloque elp
modificador para imprimir líneas donde haya algo que extraer (aquí hay una sola línea, por lo que no importa). Consulte Devolver solo la parte de una línea después de un patrón coincidente y Extraer una expresión regular combinada con 'sed' sin imprimir los caracteres circundantes para obtener más trucos sed.Más flexible de nuevo que sed, es awk. Awk ejecuta instrucciones para cada línea en un pequeño lenguaje imperativo. Hay muchas formas de extraer la tasa aquí; Selecciono los segundos campos (los campos están delimitados por espacios en blanco de forma predeterminada) y elimino todos los caracteres que no son un dígito.
El siguiente paso, ahora que ha extraído la tasa, es pasarla como argumento a
command2
. La herramienta para eso es una sustitución de comandos . Si coloca un comando dentro$(…)
(paréntesis dólar), su salida se sustituye en la línea de comando. La salida del comando se divide en palabras separadas en cada bloque de espacios en blanco, y cada palabra se trata como un patrón comodín; a menos que usted quiere que esto suceda, ponga comillas alrededor de la sustitución de comandos:"$(…)"
. Con las comillas dobles, la salida del comando se usa directamente como un parámetro único (la única transformación es que se eliminan las nuevas líneas al final de la salida).fuente
Puede usar
grep
y es PCRE - Expresiones regulares compatibles con Perl. Esto le permite utilizar una mirada retrospectiva para que coincida con el valor de la tasa, sin incluir la cadena "tasa" dentro de sus resultados cuando lo busque.Ejemplo
Detalles
Lo anterior
grep
funciona de la siguiente manera:-o
devolverá solo lo que estamos buscando\d+
, que son los dígitos dentro de los parens.-P
habilita la función PCRE de grep(?<=^rate \()
solo devolverá cadenas que comiencen con "rate ("comando2
Para atrapar el valor de "tasa" puede ejecutar
command1
así:Luego, para su segundo comando, simplemente usaría esa variable.
Podrías ponerte elegante y hacer que todo sea una línea:
Esto ejecutará command1 dentro del
$(..)
bloque de ejecución, tomará sus resultados e los incluirá en el-t=..
interruptor de command2 .fuente
Generalmente uso `command` para colocar su salida como argumento para otro comando. Por ejemplo, para encontrar el recurso consumido por el proceso foo en freebsd será:
Aquí, pgrep se usa para extraer el PID del proceso foo que se pasa al comando procstat que espera el PID del proceso como argumento.
fuente