![如何查找特殊字符 NUL (^@^@^@)](https://linux22.com/image/1339087/%E5%A6%82%E4%BD%95%E6%9F%A5%E6%89%BE%E7%89%B9%E6%AE%8A%E5%AD%97%E7%AC%A6%20NUL%20(%5E%40%5E%40%5E%40).png)
文件:
O000000667520994000000074720121112000000N^@^@^@
我使用了以下命令,但它不起作用。
grep "^@^@^@" *
答案1
您可以在 perl-regexp 模式 (-P) 下通过十六进制代码 grep 任何字符,包括控制/不可打印字符:
grep -Pa '\x00' ...
答案2
^@
不是插入符号^
和 at 符号@
,而是一个字符。这是某些程序显示 NUL 字符(ASCII 值 0,\0
在 C 中也称为)的方式。
在这里我创建了一个包含 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 很难找到 NUL,因为它们在 C 中被用来终止字符串。但是,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' ...
答案4
字符 ^@ 是 NUL 字符,因此恐怕无法直接对其进行 grep。
最好的选择可能是编写一个搜索该字节序列的简单程序。
或者,您可以尝试将其转换为某种形式的十六进制转储(od
,xxd
或类似),然后对其输出进行 grep。但坦率地说,要做到这一点会很棘手。