fgrep соответствует литералу "*" - PullRequest
2 голосов
/ 22 марта 2012

Я пытаюсь очистить мои файлы журналов от строк, которые содержат некоторые строки. Строки находятся в файле и состоят из случайных символов [клавиатуры] [да также *, + и т. Д.] Похоже, grep делает точное соответствие *:

grep "abc*" logs :gives a matchine line
blah_blah """abc*""" duh_duh 

However when I read it off the file it doesnt work with fgrep:
cat file:
"abc*"
fgrep -f file logs => Matches nothing

Я думал, что fgrep - это то же самое, что и grep + f [grep -f]. Есть ли какой-нибудь флаг, который я могу использовать с fgrep, чтобы это произошло?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 22 марта 2012

fgrep эквивалентно grep -F, а не grep -f. А опция -F соответствует фиксированным строкам, а не шаблонам. Если вы пытаетесь сопоставить буквенную строку «abc *», это отличается от регулярного выражения, начинающегося с «ab» и сопровождаемого нулем или более символами «c».

Давайте установим, с чем мы работаем:

[ghoti@pc ~]$ cat logs.txt 
ab
blah_blah """abc*""" duh_duh
abc
[ghoti@pc ~]$ cat patterns.txt 
abc*
[ghoti@pc ~]$ 

И попробуйте grep и fgrep:

[ghoti@pc ~]$ grep -f patterns.txt logs.txt 
ab
blah_blah """abc*""" duh_duh
abc
[ghoti@pc ~]$ fgrep -f patterns.txt logs.txt 
blah_blah """abc*""" duh_duh
[ghoti@pc ~]$ 

Как видите, шаблон интерпретируется как регулярное выражение grep, а как буквальная строка fgrep.

Убедитесь, что вы соответствуете строк или шаблонов , и вы будете знать, какую версию grep вам следует использовать.

0 голосов
/ 22 марта 2012

Какую версию grep вы используете?Вероятно, это может быть ошибка, которая была исправлена ​​в последних версиях, потому что у меня все отлично работает:

$ cat logs.txt
blah_blah """abc*""" duh_duh
$ cat patterns.txt
"abc*"
$ fgrep -f patterns.txt logs.txt
blah_blah """abc*""" duh_duh
$ fgrep --version
GNU grep 2.6.3
...