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


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.