grepは一致するものを印刷しません。

grepは一致するものを印刷しません。

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

バイナリの内容を含むファイルを強制的にgrepASCIIとして処理するには、対応する-aフラグを使用します。

grep -a 'Apr 12' /var/log/auth.log

これは非標準オプションですが、GNUgrepgrepOpenBSD(および他のBSD)で実装されています。

grepGNUは、NULLバイトを含む場合、または現在のロケールに対して正しくエンコードされていないデータを処理すると、grepそれをバイナリとして扱います。-aまたはを使用すると、--binary-files=textGNUはgrepそのようなデータをテキストとして扱う必要があります。--binary-filesGNU マニュアルのこのオプションのドキュメントを参照してくださいgrep

grepバイナリデータ出力は通常、「出力が端末で行われ、端末ドライバがその一部をコマンドとして解釈する場合、不快な副作用がある可能性があるため」拒否されます。 (説明書から引用)。

おすすめ記事