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).

Для GNU grep fgrep предоставляется просто как символическая ссылка на grep, что заставляет его принимать -F
Daenyth

3
egrepи fgrepне определены стандартом POSIX; grep -Fи grep -E являются
Ричард Хансен


3

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

awk '{for(i=1;i<=NF;i++) if($i == "mystring") {print "do data manipulation here"} }' file

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

2
Я не согласен. Это полезная иллюстрация того, как это работает.
timwaagh 05
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.