Unix의 특수 문자에 대한 grep


94

여러 줄에 다음과 같은 일반 및 특수 문자 문자열을 포함 할 수있는 로그 파일 (application.log)이 있습니다.

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

이 특수 문자열이 포함 된 줄 번호를 검색하고 싶습니다.

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

위의 명령은 결과를 반환하지 않습니다.

줄 번호를 얻는 올바른 구문은 무엇입니까?


^@: ^뒤에 @또는 nul 문자가 오는 것을 의미 합니까?
Nahuel Fouilleul

답변:


156

에게 grep사용하여 고정 문자열로 입력을 처리하는 -F옵션을 선택합니다.

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

-n라인 번호를 얻으려면 옵션 이 필요합니다.

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

7
만 (백 슬래시) 이스케이프 할 필요가 그렙의 버전을 따라 ^, $, ., *\ . 또는 시도 할 수도 fgrep있습니다.
나우 Fouilleul

2
@NahuelFouilleul : +1. btw fgrepgrep -F.
Prince John Wesley

@PrinceJohnWesley : 그것은 동일합니다하지만 일부 시스템에있는 지원 -F 버전을 찾을 수 있습니다 fgrep를 사용하여 너무 GREP의 많은 버전이 있습니다
나우 Fouilleul을

그가 사용한다면 egrep '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log?
inckka

작동하지 않습니다. grep -rinF '-static'인쇄합니다 Invalid option «t». 에서 @ 마니의 대답은 일 , 즉 grep -rin "\-static".
Hi-Angel

92

나를 위해 일한 것은 다음과 같습니다.

grep -e '->'

-e는 다음 인수가 패턴이며 인수로 해석되지 않음을 의미합니다.

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


str = '! "# $ % & () * +,-. / :; <=>? @ [\] ^ _`{|} ~ '; echo"$ str "| grep -e"$ str "..... 하지만 승리 -F 대신 -e의 작업입니다 '-'! 당신이 스위치 기호 외에 충분한 특수 문자를 가지고 있지 않은 근무 무엇 NOT WORKING,
THESorcerer

1
나를 위해 작동하는 유일한 방법은 '\'또는 -F 또는 fgrep도 작동하지 않습니다. 감사!
user180574

2
이것은 허용 대답해야한다 - 간단하고 그렙 작동
Ishay 펠 레드

1
시도한 -F 및 fgrep은 문자열을 검색 할 때 '-'문자를 포함하면 작동하지 않습니다. 작동합니다.
世界知名伟人

이 질문에 왜이 답변이 있는지 궁금합니다 ( 현재보고있는 Q & A에 대한 참조는 stackoverflow.com/q/12387685)- 다른 질문에서 병합되는 잘못된 답변의 경우일까요? 로 시작하는 패턴을 검색하려면 stackoverflow.com/questions/2427913/…을- 참조하십시오.
Sundeep

6

관련 메모

캐리지 리턴, 즉 \r문자 또는를 grep하려면 다음 0x0d과 같이 할 수 있습니다.

grep -F $'\r' application.log

또는 POSIX 호환성을 위해, 또는를 사용하십시오 printf.echo

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

그리고 우리가 사용할 수있는 hexdump, 또는 less참조 결과를 :

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

사용 $'\r'및 기타 지원되는 문자에 대해서는 Bash Manual> ANSI-C Quoting을 참조하십시오 .

$ 'string'형태의 단어는 특별히 취급됩니다. ANSI C 표준에 지정된대로 백 슬래시 이스케이프 문자가 대체 된 문자열로 단어가 확장됩니다.


3
grep -n "\*\^\%\Q\&\$\&\^\@\$\&\!\^\@\$\&\^\&\^\&\^\&" test.log
1:*^%Q&$&^@$&!^@$&^&^&^&
8:*^%Q&$&^@$&!^@$&^&^&^&
14:*^%Q&$&^@$&!^@$&^&^&^&

2

영숫자 문자와 공백을 제거 할 수 있습니다. 그런 다음 사용 -n하면 줄 번호가 제공됩니다. 다음을 시도하십시오.

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


감사합니다 .. 파일에서 특수 문자를 찾는 것이 좋습니다.
Dipankar Nalui

-4

-b 옵션과 함께 vi를 시도하면 특수한 줄 끝 문자가 표시됩니다 (일반적으로 유닉스 OS의 txt 파일에서 창 줄 끝을 볼 때 사용합니다).

그러나 스크립팅 된 솔루션을 원한다면 분명히 vi가 작동하지 않으므로 grep과 함께 -f 또는 -e 옵션을 시도하고 결과를 sed 또는 awk로 파이프 할 수 있습니다. grep man 페이지에서 :

Matcher Selection -E, --extended-regexp PATTERN을 확장 정규식으로 해석합니다 (ERE, 아래 참조). (-E는 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.)

2
어떤면에서 이것이 받아 들여진 대답보다 낫기 때문에 거의 5 년 된 질문에 추가 했습니까?
SergGr 2017 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.