Você está confundindo dois tipos muito diferentes de entradas.
- Entrada padrão (
stdin
)
- Argumentos da linha de comando
Estes são diferentes e são úteis para diferentes fins. Alguns comandos podem receber entrada de ambos os modos, mas geralmente os usam de maneira diferente. Tome por exemplo o wc
comando:
Passagem de entrada por stdin
:
ls | wc -l
Isso contará as linhas na saída de ls
Passando entrada por argumentos de linha de comando:
wc -l $(ls)
Isso contará linhas na lista de arquivos impressos porls
Coisas completamente diferentes.
Para responder sua pergunta, parece que você deseja capturar a taxa da saída do primeiro comando e, em seguida, use a taxa como argumento de linha de comando para o segundo comando. Aqui está uma maneira de fazer isso:
rate=$(command1 | sed -ne 's/^rate..\([0-9]*\)%.*/\1/p')
command2 -t "rate was $rate"
Explicação do sed
:
- O
s/pattern/replacement/
comando é substituir algum padrão
- O padrão significa: a linha deve começar com "taxa" (
^rate
) seguida por dois caracteres ( ..
), seguida por 0 ou mais dígitos, seguida por a %
, seguida pelo resto do texto ( .*
)
\1
na substituição significa o conteúdo da primeira expressão capturada \(...\)
, portanto, neste caso, os dígitos antes do %
sinal
- O
-n
sinalizador do sed
comando significa não imprimir linhas por padrão. O p
no final do s///
comando significa imprimir a linha se houver uma substituição. Em resumo, o comando imprimirá algo apenas se houver uma correspondência.
Para simular a saída de
command1
estou usando esta instrução echo:Um teste rápido:
Tudo bem, então vamos analisar:
Então, obtemos a linha que queremos
command1
, vamos passar paracommand2
:Estou esperando
"rate was "$(command1 | grep 'rate')
concatenar automaticamente. Se isso não funcionar por causa do espaço em branco, você poderá passar a entrada assim:fonte
Tente fazer isso usando grep & pcre :
fonte
A primeira tarefa é extrair a taxa dessa linha. Com o GNU grep (Linux ou Cygwin não incorporado), você pode usar a
-o
opção A parte que você deseja é aquela que contém apenas dígitos e seguida por um%
sinal. Se você não deseja extrair o%
próprio, precisará de um truque adicional: uma asserção lookahead de largura zero , que não corresponde a nada, mas apenas se esse nada for seguido por%
.Outra possibilidade é usar o sed. Para extrair uma parte de uma linha no sed, use o
s
comando, com um regex que corresponda à linha inteira (iniciando^
e terminando com$
), com a parte a ser mantida em um grupo (\(…\)
). Substitua a linha inteira pelo conteúdo do (s) grupo (s) a manter. Em geral, passe a-n
opção de desativar a impressão padrão e coloque op
modificador para imprimir linhas onde houver algo a extrair (aqui há uma única linha para que isso não importe). Consulte Retornar apenas a parte de uma linha após um padrão correspondente e Extraindo uma regex correspondente a 'sed' sem imprimir os caracteres ao redor para obter mais truques de sed.Mais flexível do que sed, é estranho. O Awk executa instruções para cada linha em uma pequena linguagem imperativa. Existem muitas maneiras de extrair a taxa aqui; Seleciono os segundos campos (os campos são delimitados por espaço em branco por padrão) e removo todos os caracteres que não são um dígito.
O próximo passo, agora que você extraiu a taxa, é passá-la como argumento para
command2
. A ferramenta para isso é uma suspeita de comando . Se você colocar um comando dentro$(…)
(parênteses em dólar), sua saída será substituída na linha de comando. A saída do comando é dividida em palavras separadas em cada bloco de espaço em branco e cada palavra é tratada como um padrão curinga; a menos que você quer que isso aconteça, coloque aspas em torno da substituição de comando:"$(…)"
. Com aspas duplas, a saída do comando é usada diretamente como um único parâmetro (a única transformação é que as novas linhas no final da saída são removidas).fonte
Você pode usar
grep
e suas expressões regulares compatíveis com PCRE - Perl. Isso permite que você utilize um lookbehind para corresponder ao valor da taxa, sem incluir a string "taxa" nos seus resultados ao cumpri-la.Exemplo
Detalhes
O acima
grep
funciona da seguinte maneira:-o
retornará apenas o que estamos procurando\d+
, que são os dígitos dentro dos parênteses.-P
habilita o recurso PCRE do grep(?<=^rate \()
retornará apenas strings que começam com "rate ("command2
Para capturar o valor de "rate", você pode executar da seguinte
command1
maneira:Então, para o seu segundo comando, você simplesmente usaria essa variável.
Você pode ser extravagante e criar uma linha única:
Isso executará o comando1 dentro do
$(..)
bloco de execução, pegará seus resultados e os incluirá no comutador do comando2-t=..
.fonte
Eu geralmente uso `command` para colocar sua saída como argumento para outro comando. Por exemplo, para encontrar recursos consumidos pelo processo foo no freebsd será:
Aqui, o pgrep é usado para extrair o PID do processo foo, que é passado ao comando procstat, que espera o PID do processo como argumento.
fonte