Греп за буквальні рядки


101

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

Чи є утиліта пошуку Unix, яка не використовувала б регулярний вираз, а просто шукає буквальні входження рядка?


Цікаво, чому питання не було "Чи можу я зробити grepпошук буквальних рядків?" замість "Чи може щось подібне grepшукати буквальні рядки?" Викрутки з плоскою головою можуть ;)
— поміщати

Відповіді:


136

Ви можете використовувати 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". Не потрібні нові рядки;)
— ADTC

2
Не доступно на Solaris. Замість цього fgrepвикористовується.
— majkinetor

2
@ADTC Я дізнався, що мені потрібно використовувати одинарні лапки для шуканого рядка, що містить лише спеціальні символи, інакше нічого не знайдеться. Тому це не повернуло жодного результату: grep --include=\*.php -FRn -e "$$"Використання одинарних підказок дало мені бажаний результат:grep --include=\*.php -FRn -e '$$'
— П'ємол

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.