Grep для буквальных строк

102

Мне нужен инструмент типа grep для поиска чисто буквальных строк. Я ищу появление строки файла журнала как части строки в отдельном файле журнала. Текст поиска может содержать всевозможные специальные символы регулярных выражений, например,[]().*^$-\ .

Есть ли поисковая утилита Unix, которая не будет использовать регулярное выражение, а просто ищет буквальные вхождения строки?

Бен
источник
Интересно, почему вопрос не был «Могу ли я выполнить grepпоиск буквальных строк?» вместо "Есть ли что-то подобное, grepчто может искать буквальные строки?" Вы знаете, что отвертки с плоской головкой подходят для головок Philips;)
ADTC

Ответы:

138

Для этого можно использовать grep с параметром -F.

-F, --fixed-strings       PATTERN is a set of newline-separated fixed strings
Скотт Стаффорд
источник
«Фиксированные строки, разделенные новой строкой» Как это сделать в командной строке терминала? Я знаю, что могу создать файл с шаблоном, но можно ли это сделать в командной строке без файла? Нажатие Enter, очевидно, выполняет команду.
ADTC
13
Я отвечу на свой вопрос. :) Вам просто нужно предоставить несколько фиксированных строк, используя повторения -eопции. Как это: grep -F -e "fixed1" -e "fixed2" -e "fixed3" -e "fixed4".
Новые
2
Недоступно в Solaris. Вместо этого fgrepиспользуется.
majkinetor
2
@ADTC Я обнаружил, что мне пришлось использовать одинарные кавычки для искомой строки, содержащей только специальные символы, иначе ничего не будет найдено. Так что это не grep --include=\*.php -FRn -e "$$"дало никакого результата: использование одинарных кавычек дало мне желаемый результат:grep --include=\*.php -FRn -e '$$'
Piemol
2
Вы находитесь правильно @ADTC. $и несколько других символов являются специальными, и они будут заменены на bash после того, как вы нажмете Enter и до выполнения grep(или любой другой команды). Вы можете указать bash оставить все символы (кроме одинарной кавычки) нетронутыми, заключив их в одинарные кавычки. Если вам нужно ввести одинарную цитату, сделайте это так'I'\''m special'
ndemou
14

Это либо, fgrepлибо то, grep -Fчто не подходит для регулярных выражений. fgrepидентичен, grep -Fно я предпочитаю не беспокоиться об аргументах, поскольку по своей природе ленив :-)

grep   ->  grep
fgrep  ->  grep -F  (fixed)
egrep  ->  grep -E  (extended)
rgrep  ->  grep -r  (recursive, on platforms that support it).
Paxdiablo
источник
Для GNU grep fgrep предоставляется просто как символическая ссылка на grep, что заставляет его принимать -F
Daenyth
3
egrepи fgrepне определены стандартом POSIX; grep -Fи grep -E являются
Ричард Хансен
4

Перейти -Fк grep.

Игнасио Васкес-Абрамс
источник
3

вы также можете использовать awk, поскольку он имеет возможность находить фиксированную строку, а также возможности программирования, например, только

awk '{for(i=1;i<=NF;i++) if($i == "mystring") {print "do data manipulation here"} }' file
призрачная собака74
источник
2
cat list.txt
one:hello:world
two:2:nothello

three:3:kudos

grep --color=always -F"hello

three" list.txt

вывод

one:hello:world
three:3:kudos
Parandhaman
источник
2
Я не согласен. Это полезная иллюстрация того, как это работает.
timwaagh 05