当我尝试 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.txt
、grep '@^' file.txt
、grep '@.*@.*@' file.txt
和其他一些表达方式,但没有成功。
答案1
当系统在没有首先刷新文件的情况下重新启动时,正在写入的文件可能会具有新的大小,但数据尚未写入磁盘。
在这种情况下,文件中的漏洞将包含 NUL 字符。 (也可以在不重新启动的情况下故意创建有漏洞的文件,但我认为这不适用于您的场景。)
有些工具会显示 NUL 字符,^@
它是单个不可打印字符的占位符,与^
后跟 a完全不同@
,这就是 grep 命令不起作用的原因。
有了这些信息,我能够找到一个回答在一个姐妹网站上。建议的解决方案是对 grep 使用以下参数:
grep -Pa '\x00'
我已经测试过这对我有用。请注意,单独使用-P
或-a
是行不通的,您需要同时使用它们\x00
才能工作。
答案2
如果您只搜索带有“@^@”的行,您可以使用grep "\@\^\@" file.txt
(您必须转义特殊字符)。