Grep dla literalnych ciągów

102

Szukam narzędzia typu grep do wyszukiwania czysto dosłownych łańcuchów. Szukam wystąpienia wiersza pliku dziennika, jako części wiersza w oddzielnym pliku dziennika. Wyszukiwany tekst może zawierać wszelkiego rodzaju znaki specjalne wyrażeń regularnych, np []().*^$-\..

Czy istnieje narzędzie do wyszukiwania systemu Unix, które nie używa wyrażeń regularnych, a jedynie szuka dosłownych wystąpień ciągu?

Ben
źródło
Zastanawiam się, dlaczego pytanie nie brzmiało „Czy mogę grepwyszukiwać dosłowne ciągi znaków?” zamiast „Czy istnieje coś takiego, grepktóre może wyszukiwać dosłowne ciągi znaków?” Wkrętaki z płaskim łbem pasują do śrub Philipsa, wiesz;)
ADTC

Odpowiedzi:

137

Możesz do tego użyć grep z opcją -F.

-F, --fixed-strings       PATTERN is a set of newline-separated fixed strings
Scott Stafford
źródło
„Ciągi znaków rozdzielonych znakami nowej linii” Jak mogę to zrobić w wierszu poleceń terminala? Wiem, że mogę utworzyć plik wzoru, ale czy bez pliku można to zrobić w monicie? Naciśnięcie Enter oczywiście wykonuje polecenie.
ADTC
13
Odpowiem na własne pytanie. :) Wystarczy podać wiele stałych ciągów za pomocą powtórzeń -eopcji. Tak: grep -F -e "fixed1" -e "fixed2" -e "fixed3" -e "fixed4". Nie są wymagane nowe linie;)
ADTC
2
Niedostępne w systemie Solaris. Zamiast tego fgrepjest używany.
majkinetor
2
@ADTC Dowiedziałem się, że muszę użyć pojedynczych cudzysłowów dla szukanego ciągu zawierającego tylko znaki specjalne, w przeciwnym razie nic nie zostanie znalezione. Więc to nie grep --include=\*.php -FRn -e "$$"zwróciło żadnego wyniku: Korzystanie z pojedynczych zapytań dało mi pożądany wynik:grep --include=\*.php -FRn -e '$$'
Piemol
2
Ci poprawne @ADTC. $a kilka innych znaków jest specjalnych i zostaną one zastąpione przez bash po naciśnięciu klawisza enter i przed grep(lub jakimkolwiek innym poleceniem) wykonaniem. Możesz powiedzieć bashowi, aby pozostawił wszystkie znaki (z wyjątkiem pojedynczego cudzysłowu) nietknięte, umieszczając je w pojedynczych cudzysłowach. Jeśli chcesz wpisać pojedynczy cytat, zrób to w ten sposób'I'\''m special'
ndemou
14

To jest albo fgrepalbo grep -Fktóry nie będzie robił wyrażeń regularnych. fgrepjest identyczny, grep -Fale wolę nie martwić się o argumenty, będąc z natury leniwy :-)

grep   ->  grep
fgrep  ->  grep -F  (fixed)
egrep  ->  grep -E  (extended)
rgrep  ->  grep -r  (recursive, on platforms that support it).
paxdiablo
źródło
W przypadku GNU grep fgrep jest po prostu dostarczany jako dowiązanie symboliczne do grep, co powoduje, że przyjmuje wartość -F
Daenyth.
3
egrepi fgrepnie są określone w standardzie POSIX; grep -Fi grep -E
Richard Hansen
4

Przejdź -Fdo grep.

Ignacio Vazquez-Abrams
źródło
3

możesz też użyć awk, ponieważ ma on możliwość znalezienia stałego łańcucha, a także możliwości programowania, np. tylko

awk '{for(i=1;i<=NF;i++) if($i == "mystring") {print "do data manipulation here"} }' file
ghostdog74
źródło
2
cat list.txt
one:hello:world
two:2:nothello

three:3:kudos

grep --color=always -F"hello

three" list.txt

wynik

one:hello:world
three:3:kudos
parandhaman
źródło
2
Nie zgadzam się. To przydatna ilustracja tego, jak to działa.
timwaagh,