Como usar o grep para procurar um padrão que comece com um hífen (-)?

4
sudo find / -name "*" | xargs grep -sn --color=auto "-j"

O comando acima retorna abaixo:

grep: invalid option -- 'j'
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.
...

Como pesquiso a string -j ?

    
por RNA 22.07.2014 / 09:11

3 respostas

4

No seu caso, "-j" é interpretado por grep como argumento / opção, não como um padrão de pesquisa, mesmo que você o tenha citado. Para fazer com que seja o padrão para o que você deseja pesquisar, use apenas -e option:

sudo find / -name "*" | xargs grep -sn --color=auto -e "-j"

ou até mesmo:

sudo find / -name "*" | xargs grep -sn --color=auto -e -j

O argumento -e / option significa que o próximo argumento é o padrão. Isso é de man grep :

   -e PATTERN, --regexp=PATTERN
          Use  PATTERN  as  the  pattern.   This  can  be  used to specify
          multiple search patterns, or to protect a pattern beginning with
          a hyphen (-).  (-e is specified by POSIX.)

Outras maneiras:

  • use -- , como @Rinzwind disse em sua resposta , para fazer grep saber que as opções terminaram.

  • use \ para escapar do hífen ( - ):

    sudo find / -name "*" | xargs grep -sn --color=auto "\-j"
    
por Radu Rădeanu 22.07.2014 / 09:49
2

Diga que as opções terminaram com -- :

sudo find / -name "*" | xargs grep -sn --color=auto -- "-j"

Resultado:

Binary file /initrd.img matches
Binary file /lib/modules/2.6.24-16-server/ubuntu/media/gspcav1/gspca.ko matches
Binary file /lib/modules/2.6.24-16-server/ubuntu/sound/alsa-driver/isa/es1688/snd-es1688.ko matches
Binary file /lib/modules/2.6.24-16-server/ubuntu/sound/alsa-driver/pci/ice1712/snd-ice1712.ko matches
/lib/modules/2.6.24-16-server/modules.dep:1807:/lib/modules/2.6.24-16-server/kernel/fs/nls/nls_euc-jp.ko:
Binary file /lib/modules/2.6.24-16-server/kernel/crypto/blowfish.ko matches
Binary file /lib/modules/2.6.24-16-server/kernel/fs/nls/nls_euc-jp.ko matches
Binary file /lib/modules/2.6.24-16-server/kernel/fs/nls/nls_cp936.ko matches
    
por Rinzwind 22.07.2014 / 09:12
1

Você pode escapar do caractere - usando \

$ sudo find / -name "*" | xargs grep -sn --color=auto "\-j"

Além disso, você pode querer excluir pastas e pesquisar somente arquivos, adicionar -type f a find :

$ sudo find / -name "*" -type f | xargs grep -sn --color=auto "\-j"

Além disso, se você adicionar -P 4 a xargs , ele será paralelo a toda a execução em 4 processos e a pesquisa poderá ser feita mais rapidamente se você tiver mais de 1 núcleo.

$ sudo find / -name "*" -type f | xargs -P 4 grep -sn --color=auto "\-j"
    
por c0rp 22.07.2014 / 09:51

Tags