我正在尝试使用 grep 打印 /var/log/auth.log 中的所有根访问尝试。但 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
正如我们所看到的,只有 4 月 11 日之前的条目。因此,如果我尝试以下命令:
> less /var/log/auth.log | grep "Apr 12"
Binary file (standard input) matches
什么都没有打印出来。但在文件 /var/log/auth.log 中,存在“Apr 12”条目,我们可以看到我是否运行此命令(我还通过使用 cat 打印整个文件来证明这一点):
> less /var/log/auth.log | grep -c "Apr 12"
4297
我不明白我的第一个 grep 命令做错了什么。
答案1
要强制grep
将具有二进制内容的文件视为 ASCII,请使用其-a
标志:
grep -a 'Apr 12' /var/log/auth.log
这是一个非标准选项,但在 GNUgrep
和grep
OpenBSD(可能还有其他 BSD)中实现。
当 GNU 处理的数据grep
包含 nul 字节,或者针对当前语言环境编码不正确时,grep
会将其视为二进制。使用-a
或--binary-files=text
,GNUgrep
将被迫将此类数据视为文本。请参阅--binary-files
GNU 手册中该选项的文档grep
。
grep
通常拒绝输出二进制数据,因为它可能“如果输出是终端并且终端驱动程序将其中一些解释为命令,则会产生令人讨厌的副作用”。 (引自手册)。