특수 문자 NUL을 grep하는 방법 (^ @ ^ @ ^ @)


26

파일:

O000000667520994000000074720121112000000N^@^@^@ 

아래 명령을 사용했지만 작동하지 않습니다.

grep "^@^@^@" *
linux  unix 

답변:


52

perl-regexp 모드 (-P)의 제어 / 인쇄 불가능 문자를 포함한 모든 문자는 16 진 코드로 grep 할 수 있습니다.

grep -Pa '\x00' ...

5
-a옵션 을 추가하고 싶을 수도 있습니다 . 그렇지 않으면 grep이진 데이터라고 생각하고 일치하는 줄을 표시하지 않습니다.
mpy

파일에 ASCII = 0 바이트 만 포함되어 있는지 확인할 방법을 찾을 수 없습니다 grep -Pv '\x00' file. Cygwin에서 작동하지 않습니다 ...
pbies

@mpy Without -a(때로는?) 패턴조차 찾지 못합니다. 감사! @pbies도 도울 수 있습니다.
Michel de Ruiter

13

^@캐럿 ^및 기호 가 아니며 @하나의 문자입니다. 일부 프로그램 \0은 C 로 알려진 NUL 문자 —ASCII 값 0을 표시하는 방법 입니다.

여기에 NUL 바이트가있는 파일을 만들었습니다. cat -v 인쇄하지 않는 문자를 표시 하는 데 사용 합니다.

$ cat -v blah
hello
null^@
hi
$ hexdump -C blah
00000000  68 65 6c 6c 6f 0a 6e 75  6c 6c 00 0a 68 69 0a     |hello.null..hi.|
0000000f

Grep은 C에서 문자열을 종료하는 데 사용되므로 NUL을 찾는 데 문제가 있습니다. 그러나 Sed는 다음 작업을 수행 할 수 있습니다.

$ sed -n '/\x0/p' blah
null
$ sed -n '/\x0/p' blah | cat -v
null^@

에서 VI, 삽입 모드 언론 Ctrl- V, Ctrl- Shift-은 @널 바이트를 삽입합니다.


3

경우 grep -P작업 (예 : OS X에서)를하지 않는,이 시도 :

grep -E '\x00' ...

이것이 효과가 있습니까? 나는 내 버전으로하지 않습니다 : grep (GNU grep) 2.14
guettli

3
이 답변은 BSD grep에 대한 grep -Pa '\x00' ...
것이며

1

bash에서 C-q또는 접두사를 붙일 때 특수 문자를 추가 할 수 있습니다 C-v. 예를 들어

grep 'Ctrl-vCtrl-a' file.txt

검색 문자열로 읽어야 control key+ character v이어 control key+ character a어느 ASCII 값 SOH (01)를 검색. 불행히도 이것은 NUL 캐릭터에게는 작동하지 않습니다.


아마도 당신은 실제로 그러한 문자 순서가 문자 그대로 쓰여 져야한다는 것을 의미하지는 않지만 키보드에 논리적으로 입력되어야합니까?
Monica와의 가벼움 경주

물론입니다. 이것은 Ctrl 키를 누른 상태에서 v를 누른 다음 Control 키를 누른 상태에서 a를 누릅니다.
Olaf Dietsche

나는 당신의 대답이 명확하지 않다고 생각합니다.
Monica와의 가벼움 경주

@LightnessRacesinOrbit 힌트 주셔서 감사합니다. 나는 대답을 명확히하려고 노력했다.
올라프 Dietsche

@JohnKugelman 편집 해 주셔서 감사합니다. 도움을 더 자세히 살펴 봐야 할 것 같습니다.
올라프 Dietsche


-3

^ ^ 문자는 NUL 문자이므로 직접 그 리핑 할 수 없습니다.

가장 좋은 방법은 아마도이 바이트 시퀀스를 검색하는 간단한 프로그램을 작성하는 것입니다.

또는 16 진수 덤프 ( od, xxd등) 형식으로 변환 하여 그 결과를 grep 하려고 시도 할 수 있습니다 . 그러나 솔직히 말해서, 그것을 올바르게 얻는 것은 까다로울 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.