Por que o grep recursivo não funciona com o STDOUT? [fechadas]

2

Há muito tempo tenho usado alguns aliases personalizados nas minhas máquinas Ubuntu / Mint, como alias grep='grep -irn --color --line-buffered' . No entanto, notei que há algum tempo isso parou de funcionar para saídas canalizadas.

Tentando depurar, notei que a opção problemática é a recursiva e, em vez de usar o STDOUT, procura no diretório atual - recursivamente.

Eu estou atualmente executando o grep 2.16, e eu encontrei uma máquina que está funcionando como eu esperava rodando 2.10.

Exemplo: tail -f /var/log/xxx.log | grep -irn yyy

O que foi alterado para que -r / -d recurse faça grep pesquisar uma pasta em vez de seguir a opção man directory?

-d ACTION, --directories=ACTION
    If an input file is a directory, use ACTION to process it.
    [...] If ACTION is recurse, read all files under each directory, recursively,
    following symbolic links only if they are on the command line. This is
    equivalent to the -r option.
    
por igorsantos07 13.01.2015 / 19:58

1 resposta

4

Essa resposta é mais adequada para um comentário, mas seria muito longa, então estou postando como resposta.

O comportamento do grep despertou meu interesse e acho que o OP está no caminho certo, e também descobri que as versões mais recentes do grep se comportam de maneira diferente das versões mais antigas. Nas versões mais antigas, se você não passasse um parâmetro ao usar -r , ele só procuraria um padrão na entrada padrão, como deveria de acordo com a documentação: grep searches the named input FILEs (or standard input if no files are named, or if a single hyphen-minus (-) is given as file name) for lines containing a match to the given pattern . Em versões mais recentes, no entanto, ele está procurando por um padrão no diretório atual, mesmo se você não forneceu nenhum nome de arquivo. Verifique isso:

$ mkdir /tmp/grep-test
$ cd /tmp/grep-test
$ echo pam > FILE
$ grep --version
grep (GNU grep) 2.10
(...)
$ grep pam -r
pam
pam
$ /home/ja/grep/grep-2.16/src/grep pam -r
FILE:pam

Não encontrei menção alguma sobre quaisquer alterações relacionadas a isso no grep changelog além de isso :

** Changes in behavior

The -r (--recursive) option now follows only command-line symlinks. Also, by default -r now reads a device only if it is named on the command line; this can be overridden with --devices. -R acts as before, so use -R if you prefer the old behavior of following all symlinks and defaulting to reading all devices.

Ainda é uma questão de questionamento porque o OP quer pesquisar a saída padrão recursivamente, mas definitivamente algo mudou no grep.

    
por 13.01.2015 / 21:24

Tags