我正在尝试使用 grep 从 /var/log/auth.log 打印所有 root 访问尝试。但似乎 grep 没有处理整个文件,而是 grep 在某个时候停止:
> less /var/log/auth.log | grep Accepted
Apr 10 08:32:43 sshd[16845]: Accepted password for root from ... port 49061 ssh2
Apr 10 09:42:38 sshd[15451]: Accepted password for root from ... port 48990 ssh2
Apr 10 10:11:17 sshd[21592]: Accepted password for root from ... port 48686 ssh2
Apr 10 12:09:03 sshd[5757]: Accepted password for root from ... port 62535 ssh2
Apr 11 18:12:12 sshd[1804]: Accepted password for root from ... port 40765 ssh2
Apr 11 18:12:30 sshd[1884]: Accepted password for root from ... port 40808 ssh2
Apr 11 18:13:46 sshd[2063]: Accepted password for root from ... port 40735 ssh2
Apr 11 19:58:44 sshd[17103]: Accepted password for root from ... port 40684 ssh2
Apr 11 20:48:06 sshd[24583]: Accepted password for root from ... port 40466 ssh2
Binary file (standard input) matches
Run Code Online (Sandbox Code Playgroud)
正如我们所看到的,直到 4 月 11 日才有条目。因此,如果我尝试以下命令:
> less /var/log/auth.log | grep "Apr 12"
Binary file (standard input) matches
Run Code Online (Sandbox Code Playgroud)
什么都不会打印。但是在文件 /var/log/auth.log 中存在“Apr 12”条目,因为我们可以看到我是否运行此命令(我还通过使用 cat 打印整个文件来证明这一点):
> less /var/log/auth.log | grep -c "Apr 12"
4297
Run Code Online (Sandbox Code Playgroud)
我不明白我的第一个 grep 命令做错了什么。
要强制grep
将具有二进制内容的文件视为 ASCII,请使用其-a
标志:
grep -a 'Apr 12' /var/log/auth.log
Run Code Online (Sandbox Code Playgroud)
这是一个非标准选项,但在 GNUgrep
和grep
OpenBSD(可能还有其他 BSD)中实现。
当 GNU 处理的数据grep
包含空字节时,或者当它针对当前语言环境编码不正确时,grep
会将其视为二进制。使用-a
或--binary-files=text
,GNUgrep
将被迫将此类数据视为文本。请参阅--binary-files
GNUgrep
手册中该选项的文档。
grep
通常拒绝输出二进制数据,因为它可能具有“如果输出是终端并且终端驱动程序将其中一些解释为命令,则会产生令人讨厌的副作用”。(引自手册)。