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?


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

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

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


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

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

2
Nie zgadzam się. To przydatna ilustracja tego, jak to działa.
timwaagh,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.