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)で実装されています。
grep
GNUは、NULLバイトを含む場合、または現在のロケールに対して正しくエンコードされていないデータを処理すると、grep
それをバイナリとして扱います。-a
またはを使用すると、--binary-files=text
GNUはgrep
そのようなデータをテキストとして扱う必要があります。--binary-files
GNU マニュアルのこのオプションのドキュメントを参照してくださいgrep
。
grep
バイナリデータ出力は通常、「出力が端末で行われ、端末ドライバがその一部をコマンドとして解釈する場合、不快な副作用がある可能性があるため」拒否されます。 (説明書から引用)。