如何从文件中 grep 查找“^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@”?

如何从文件中 grep 查找“^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@”?

当我尝试 grep 下面的表达式时。

$ grep -A2 "IPv6: ADDRCONF(NETDEV_CHANGE): eth1: link becomes ready" log.txt

我得到的结果是 -

date-time kern servname: []: info [   83.262033] IPv6: ADDRCONF(NETDEV_CHANGE): eth1: link becomes ready
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
^@^@^@date-time syslog servname syslog-ng[10831]: notice syslog-ng starting up; version='3.2.5'
date-time kern servname: []: info [    0.000000] Initializing cgroup subsys cpuset

现在,我相信这@@@@代表系统崩溃,我如何才能 grep 得到“@^@”。

我尝试了grep @^ file.txtgrep '@^' file.txtgrep '@.*@.*@' file.txt和其他一些表达方式,但没有成功。

答案1

当系统在没有首先刷新文件的情况下重新启动时,正在写入的文件可能会具有新的大小,但数据尚未写入磁盘。

在这种情况下,文件中的漏洞将包含 NUL 字符。 (也可以在不重新启动的情况下故意创建有漏洞的文件,但我认为这不适用于您的场景。)

有些工具会显示 NUL 字符,^@它是单个不可打印字符的占位符,与^后跟 a完全不同@,这就是 grep 命令不起作用的原因。

有了这些信息,我能够找到一个回答在一个姐妹网站上。建议的解决方案是对 grep 使用以下参数:

grep -Pa '\x00'

我已经测试过这对我有用。请注意,单独使用-P-a是行不通的,您需要同时使用它们\x00才能工作。

答案2

如果您只搜索带有“@^@”的行,您可以使用grep "\@\^\@" file.txt(您必须转义特殊字符)。

相关内容