我如何从文件中找到这个“^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@”?

Vig*_* SP 0 linux grep linux-kernel

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

$ grep -A2 "IPv6: ADDRCONF(NETDEV_CHANGE): eth1: link becomes ready" log.txt
Run Code Online (Sandbox Code Playgroud)

我得到的结果是 -

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
Run Code Online (Sandbox Code Playgroud)

现在@@@@我相信它代表系统崩溃,我怎么能只为“@^@”grep。

我尝试了grep @^ file.txt, grep '@^' file.txt,grep '@.*@.*@' file.txt和其他一些表达方式,但运气不佳。

kas*_*erd 5

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

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

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

有了这些信息,我就可以在姐妹网站上找到答案。解决方案建议对 grep 使用以下参数:

grep -Pa '\x00'
Run Code Online (Sandbox Code Playgroud)

我已经测试过这对我有用。请注意,单独使用-P-a不起作用,您确实需要它们才能\x00起作用。