grep dla znaków specjalnych w Uniksie

95

Mam plik dziennika (application.log), który może zawierać następujący ciąg normalnych i specjalnych znaków w wielu wierszach:

*^%Q&$*&^@$&*!^@$*&^&^*&^&

Chcę wyszukać numer (y) linii, które zawierają ten specjalny ciąg znaków.

grep '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log

Powyższe polecenie nie zwraca żadnych wyników.

Jaka byłaby poprawna składnia, aby uzyskać numery wierszy?

Avinash Sonee
źródło
^@: oznacza, ^po którym następuje @lub znak nul?
Nahuel Fouilleul

Odpowiedzi:

158

Powiedz, grepaby traktować dane wejściowe jako ustalony ciąg przy użyciu -Fopcji.

grep -F '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log

Opcja -njest wymagana, aby uzyskać numer linii,

grep -Fn '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log
Książę John Wesley
źródło
7
W zależności wersję grep trzeba tylko uciec (z odwrotnym ukośnikiem) ^, $, ., *i \ . lub możesz też spróbować fgrep.
Nahuel Fouilleul
2
@NahuelFouilleul: +1. btw, fgrepjest taki sam jak grep -F.
Prince John Wesley
@PrinceJohnWesley: to to samo, ale w niektórych systemach istnieje wiele wersji grepa, więc użycie fgrep może znaleźć wersję obsługującą -F
Nahuel Fouilleul
A jeśli użyje egrep '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log?
inckka
Nie działa. grep -rinF '-static'wydruki Invalid option «t». Odpowiedź @ Mani zadziałała , tj grep -rin "\-static".
Hi-Angel
92

Ten, który działał dla mnie, to:

grep -e '->'

-E oznacza, że ​​następny argument jest wzorcem i nie będzie interpretowany jako argument.

Od: http://www.linuxquestions.org/questions/programming-9/how-to-grep-for-string-769460/

Tom Brito
źródło
str = '! "# $% & () * +, -. /:; <=>? @ [\] ^ _` {|} ~ '; echo "$ str" | grep -e "$ str" ..... NIE DZIAŁA, to, co zadziałało, nie miało wystarczającej liczby znaków specjalnych oprócz znaku przełączania '-', ale win -F zamiast -e
DZIAŁA
1
Jedyna rzecz działa u mnie, nawet '\' lub -F lub fgrep nie działają. Dzięki!
user180574
2
To powinna być akceptowana odpowiedź - prosta i działa dla
grepa
1
Wypróbowane -F i fgrep nie działają dla mnie podczas wyszukiwania łańcucha zawierającego znak „-”. To działa.
世界 知名 伟人
Zastanawiam się, dlaczego ta odpowiedź jest obecna w tym pytaniu ( stackoverflow.com/q/12387685 w odniesieniu do pytań i odpowiedzi, które obecnie przeglądam) - prawdopodobnie niewłaściwy przypadek łączenia odpowiedzi z innego pytania? Aby wyszukać wzorce zaczynające się od -, zobacz także stackoverflow.com/questions/2427913/…
Niedziela,
6

Powiązana uwaga

Aby grep do powrotu karetki, a mianowicie \rznak, lub 0x0dmożemy to zrobić:

grep -F $'\r' application.log

Alternatywnie użyj printflub echo, aby uzyskać zgodność z POSIX

grep -F "$(printf '\r')" application.log

I możemy użyć hexdumplub, lessaby zobaczyć wynik:

$ printf "a\rb" | grep -F $'\r' | hexdump -c
0000000   a  \r   b  \n

Odnośnie użycia $'\r'i innych obsługiwanych znaków, zobacz Podręcznik Bash> Cytowanie ANSI-C :

Słowa w postaci $ 'string' są traktowane specjalnie. Słowo jest interpretowane jako łańcuch, a znaki ze znakami ucieczki odwrotnym ukośnikiem są zastępowane zgodnie ze standardem ANSI C.

ryenus
źródło
3
grep -n "\*\^\%\Q\&\$\&\^\@\$\&\!\^\@\$\&\^\&\^\&\^\&" test.log
1:*^%Q&$&^@$&!^@$&^&^&^&
8:*^%Q&$&^@$&!^@$&^&^&^&
14:*^%Q&$&^@$&!^@$&^&^&^&
Mani
źródło
2

Możesz spróbować usunąć wszelkie znaki alfanumeryczne i spacje. A następnie użyj -npoda numer linii. Spróbuj wykonać następujące czynności:

grep -vn "^[a-zA-Z0-9 ]*$" application.log

R. Kumar
źródło
Dzięki ... Dobrze mi jest znaleźć znaki specjalne z pliku.
Dipankar Nalui
-4

Wypróbuj vi z opcją -b, to pokaże specjalne znaki końca linii (zwykle używam go do zobaczenia końców linii Windows w pliku txt w systemie operacyjnym unix)

Ale jeśli chcesz, aby rozwiązanie oparte na skryptach było oczywiste, vi nie zadziała, więc możesz wypróbować opcje -f lub -e z grep i przesłać wynik do sed lub awk. Ze strony podręcznika grep:

Wybór dopasowania -E, --extended-regexp Interpretuje WZÓR jako rozszerzone wyrażenie regularne (ERE, patrz poniżej). (-E jest określone przez POSIX.)

   -F, --fixed-strings
          Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched.  (-F is specified
          by POSIX.)
user7648830
źródło
2
W jakim sensie jest to lepsze niż zaakceptowana odpowiedź, więc dodałeś ją do pytania sprzed prawie 5 lat?
SergGr