Como grep do tee?

0

Eu quero verificar se a saída do meu comando contém "rerun" (e, em seguida, execute novamente), mas também quero exibir toda a saída. Eu sei que eu poderia usar um destes:

command | tee >(grep rerun)
command | grep rerun

O primeiro imprime toda a saída como esperado, mas não posso usá-la como condição porque ela sempre retorna 0. A segunda imprime apenas as linhas que contêm reexecução, mas retorna 1 se não houver correspondência. / p>

Meu exemplo de uso:

while pdflatex paper.tex | grep -E "rerun LaTeX|run Biber"; do
    biber paper
done

As respostas fornecidas aqui também não ajudam, pois o grep sempre retorna 0.

    
por Max Matti 02.08.2018 / 14:53

2 respostas

1

Apenas use

command | tee outfile | grep rerun

ou

while pdflatex paper.tex | tee outfile | grep -E "rerun LaTeX|run Biber"; do

Você pode verificar o status do comando grep e depois pode ver o arquivo "output".

    
por 02.08.2018 / 18:46
0

você pode tee para um arquivo e executar o grep no arquivo. Então você pode usar o código de saída do grep (0 quando houver uma partida):

RERUN=1
while [[ $RERUN == 1 ]] ; do
  biber paper
  ! pdflatex paper.tex | tee output.txt && grep -E -q "rerun LaTeX|run Biber" output.txt
  RERUN=$?
done

O ! na quarta linha inverte o código de saída do processo grep porque o grep retorna 0 quando ele encontra uma correspondência e 1 quando não corresponde, veja o página do manual do grep :

EXIT STATUS

   Normally the exit status is 0 if a line is selected, 1 if no lines were
   selected, and 2 if an error occurred.  However, if the -q or --quiet or
   --silent is used and a line is selected, the exit status is 0  even  if
   an error occurred.

A quinta linha coloca o último código de saída ( $? ) no RERUN var que é usado na condição de loop.

Eu também adicionei a opção -q ao grep para não gravar no stdout

    
por 02.08.2018 / 18:24