Как использовать grep для поиска шаблона, который начинается с дефиса (-)?

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

Над командами возвращается ниже:

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

Как искать строку -j ?

В вашем случае "-j" интерпретируется grep как аргумент / параметр, а не как шаблон поиска, даже если вы его процитировали. Чтобы сделать его образцом для поиска, просто используйте параметр -e :

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

или даже:

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

Параметр -e аргумент / означает, что следующим аргументом является шаблон. Это от 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.) 

Другие способы:

  • используйте, как сказал @Rinzwind в своем ответе , чтобы grep знал, что варианты закончены.

  • используйте \ чтобы избежать дефиса ( - ):

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

Скажите, что варианты закончились:

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

Результат:

 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 

Вы можете избежать - символ, используя \

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

Также вы можете исключить папки и искать только файлы, добавить -type f чтобы find :

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

Также, если вы добавите -P 4 в xargs , он будет выполнять все выполнение на 4 процессах, и поиск может быть выполнен быстрее, если у вас более 1 ядра.

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