如何grep特殊字符NUL(^ @ ^ @ ^ @)


26

文件:

O000000667520994000000074720121112000000N^@^@^@ 

我使用了以下命令,但是它不起作用。

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

Answers:


52

您可以通过其十六进制代码对perl-regexp模式(-P)中的任何字符(包括控制/不可打印字符)进行grep表示:

grep -Pa '\x00' ...

5
您可能想添加-a选项,否则grep认为它是二进制数据,并且不会显示匹配的行。
mpy 2013年

我找不到一种方法来检查文件是否仅包含ASCII = 0字节... grep -Pv '\x00' file在Cygwin中不起作用...
pbies,

@mpy没有-a(有时?),甚至找不到模式。谢谢!也可能会帮助@pbies。
Michel de Ruiter

13

^@不是克拉^符号@,而是一个字符。这就是某些程序如何显示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,因为NUL用于终止C中的字符串。但是,Sed可以做到这一点:

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

在VI,在插入模式下按Ctrl- VCtrl- Shift- @插入一个空字节。


3

如果grep -P不起作用(例如在OS X上),请尝试以下操作:

grep -E '\x00' ...

您确定这可行吗?我没有使用我的版本:grep(GNU grep)2.14
guettli

3
此答案适用于BSD grep,请尝试使用GNU grep的最佳答案:grep -Pa '\x00' ...
robinst

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)进行的轻度比赛2012年

当然是。按住Control键,然后按v,然后按住Control键,然后按a。
Olaf Dietsche 2012年

我认为您的答案尚不清楚。
与莫妮卡(Monica)进行的轻度比赛2012年

@LightnessRacesinOrbit感谢您的提示。我试图在答案中阐明。
Olaf Dietsche 2012年

@JohnKugelman感谢您的编辑。似乎我应该更仔细地研究帮助。
Olaf Dietsche 2012年


-3

字符^ @是NUL字符,因此恐怕不能直接删除。

最好的选择可能是编写一个简单的程序来搜索此字节序列。

或者,你可以尝试把它转换成某种形式的十六进制转储(的odxxd或左右)和grep到它的输出。但是坦率地说,正确处理是很难的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.