현재 netcat
파이프 출력이 tee
output.txt에 기록되고 있습니다.
nc -l -k -p 9100 | tee output.txt
이 출력을 모니터링하고 싶기 때문에 tail -f | egrep -i 'regex'
관련 비트만 볼 수 있도록 PuTTY를 통해 시청합니다.
때때로 출력 파일을 지우고 싶습니다. 발생하는 문제는 이 작업을 수행 > output.txt
한 다음 다시 시도 하면 tail -f | egrep ...
아무런 결과도 얻지 못한다는 것입니다. 파일을 검색하면 일치하는 항목이 있다는 것을 알면서도 일치하는 항목을 얻지 못합니다.~해야 한다일치( cat output.txt
파일을 올바르게 뱉어냅니다)
mitch@quartz:~$ grep output.txt -e 'regex'
Binary file output.txt matches
그리고 output.txt에도 동일한 명령을 사용하십시오.앞으로비어 있으면 잘 작동합니다.
기본적으로 >
사람들이 grep
내 파일이 바이너리라고 생각하게 만들고 제대로 검색하지 못하게 만듭니다. 파일을 지우는 더 좋은 방법이 있습니까?
답변1
유일한 문제가 grep
바이너리로 처리하는 것이라면 grep
어쨌든 검색하라고 지시하세요.
$ head /bin/bash > out
$ echo "test" >> out
$ grep test out
Binary file out matches
$ grep -a test out
test
에서 man grep
:
-a, --text
Process a binary file as if it were text; this is equivalent to
the --binary-files=text option.
답변2
귀하의 질문에 대한 답변이 될 수 있으므로 방금 실행한 몇 가지 테스트 결과는 다음과 같습니다.
$ > output.txt
$ file output.txt
output.txt: empty
$ echo "" > output.txt
$ file output.txt
output.txt: very short file (no magic)
$ echo " " > output.txt
$ file output.txt
output.txt : ASCII text
보시다시피 파일은 실제 콘텐츠와 다르게 분류됩니다."놓다이를 지우려고 하면 "가 포함되어 있습니다. 따라서 아무것도 없는 대신 빈 문자열을 사용하는 것이 좋습니다.
답변3
>
grep은 파일이 바이너리라고 생각하게 만듭니다. 왜냐하면 바이너리이기 때문입니다. 문제는 파일을 비웠지만 파일을 채운 프로그램을 중지하지 않았다는 것입니다.
>output.txt
output.txt
존재하지 않으면 생성하고 존재하는 경우 길이를 0으로 자릅니다.
>output.txt
프로세스 를 실행할 때 tee
파일이 열려 있습니다 . 파일을 잘라도 파일이 tee
기록되는 위치에는 영향을 주지 않습니다 . 썼다고 가정하면질소잘리기 전의 바이트 수입니다. tee
다음에 잘린 후 쓸 때에는 이 위치부터 쓰기가 시작됩니다.질소. 현재 파일 끝 이후에 쓰기를 허용하고 파일 시작 부분을 널 바이트로 채웁니다. 이것이 바로 여기서 일어나고 있는 일입니다.
Grep은 일부 null 바이트로 시작하는 파일을 확인합니다. 파일을 바이너리로 올바르게 보고합니다.
grep 을 호출하여 GNU grep 에게 파일을 텍스트로 처리하도록 지시할 수 있습니다 grep -a
. Null 바이트를 포함한 전체 파일을 검색합니다. (일치하지 않으므로 첫 번째 줄에 일치하지 않으면 결과에 영향을 미치지 않지만, 많으면 속도가 느려질 수 있습니다.) .
더 나은 해결책은 tee
항상 파일의 현재 끝 부분에 쓰도록 지시하는 것입니다. 다행히 (스티븐 차제라스 코멘트) 옵션이 있습니다: ( tee -a
모든 POSIX 호환 시스템에 존재). 먼저 파일을 잘라야 합니다.
>output.txt
nc -l -k -p 9100 | tee -a output.txt
대부분의 파일 시스템에서는 완전히 null 바이트로 구성된 블록을 할당되지 않은 상태로 유지하는 것을 허용합니다. 이 특별한 압축 방법을 만들기라고 합니다.스파스 파일.