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

이는 비표준 옵션이지만 GNU grepgrepOpenBSD(및 기타 BSD)에서 구현됩니다.

grepGNU는 nul 바이트를 포함하거나 현재 로케일에 대해 올바르게 인코딩되지 않은 데이터를 처리할 때 grep이를 바이너리로 처리합니다. -a또는 를 사용하면 --binary-files=textGNU는 grep그러한 데이터를 텍스트로 처리해야 합니다. --binary-filesGNU 매뉴얼에서 이 옵션에 대한 문서를 참조하십시오 grep.

grep바이너리 데이터 출력은 일반적으로 "출력이 터미널로 이루어지고 터미널 드라이버가 그 중 일부를 명령으로 해석하는 경우 불쾌한 부작용이 있을 수 있기 때문에" 거부됩니다. (설명서에서 인용).

관련 정보