grep은 파일에서 16진수 값을 찾아야 하지만 그렇지 않습니다.

grep은 파일에서 16진수 값을 찾아야 하지만 그렇지 않습니다.

파일의 시작 부분은 다음과 같습니다.

# hexdump -n 550 myFile
0000000 f0f2 f5f0 f7f9 f1f1 f1f0 f0f0 e3f1 f3c8
0000010 f3f5 0000 0000 000c 0000 0000 0000 000c
0000020 0000 0c00 0000 0000 0000 0c00 0000 0000
0000030 000c 0000 0000 0000 000c 0000 0c00 0000
0000040 0000 0000 0c00 0000 0000 000c 0000 0000
0000050 0000 000c 0000 0c00 0000 0000 0000 0c00
0000060 0000 0000 000c 0000 0000 0000 000c 0000
*
00000b0 0000 0000 000c 0000 0000 0000 0000 0000
00000c0 0000 0000 0000 0c00 0000 0000 0000 0c00
00000d0 0000 0000 000c 0000 0000 0000 000c 0000
00000e0 0c00 0000 0000 0000 0c00 0000 0000 000c
00000f0 0000 0000 0000 000c 0000 0c00 0000 0000
0000100 0000 0c00 0000 0000 000c 0000 0000 0000
0000110 000c 0000 0c00 0000 0000 0000 0c00 0000
0000120 0000 0000 0c00 0000 0000 0000 0c00 0000
*
0000160 0000 0000 0c00 0000 0000 0000 0000 0000
0000170 0000 0000 0000 0000 000c 0000 0000 0000
0000180 000c 0000 0c00 0000 0000 0000 0c00 0000
0000190 0000 000c 0000 0000 0000 000c 0000 0c00
00001a0 0000 0000 0000 0c00 0000 0000 000c 0000
00001b0 0000 0000 000c 0000 0c00 0000 0000 0000
00001c0 0c00 0000 0000 000c 0000 0000 0000 000c
00001d0 0000 0000 0000 000c 0000 0000 0000 000c
*
0000210 0000 0000 0000 000c 0000 0000 0000 0000
0000220 0000 0000 0a00
0000226

여기서 16진수 값을 볼 수 0c있고0a

0cgrep이 발견되었지만 왜 발견되지 않았는지 이해하지 못합니다 0a.

# grep -P '\x0c' myFile
Fichier binaire myFile correspondant
# grep -P '\x0a' myFile
<nothing in the output>

CentOS를 사용하고 있습니다.

답변1

\x0a단순한 16진수 값이 아니라 ASCII 개행 문자에 해당하는 16진수 값입니다.

grep(기본적으로)은 줄 기반이므로 패턴 일치 전에 개행 문자가 제거됩니다. 최소한 GNU grep에서는 -z다음 옵션을 사용하여 이 동작을 변경할 수 있습니다:

   -z, --null-data
          Treat  input  and  output  data  as  sequences  of  lines,  each
          terminated by a zero byte (the ASCII NUL character) instead of a
          newline. 

그러나 이렇게 하면 ASCII null 값이 제거되므로 더 이상 grep을 수행할 수 없습니다.그것들.

관련 정보