grep 없이 파일을 비우면 이후에 바이너리 파일처럼 처리됩니다.

grep 없이 파일을 비우면 이후에 바이너리 파일처럼 처리됩니다.

현재 나는 다음과 같이 output.txt에 쓰는 netcat파이프 출력을 가지고 있습니다.tee

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썼다고 해보자N잘림 앞의 바이트입니다. 다음번에 tee잘린 후 쓸 때는 다음 위치에서 쓰기 시작합니다.N. 파일의 현재 끝을 넘어서는 위치에 쓰는 것이 허용되며 파일의 시작 부분을 null 바이트로 채웁니다.¹ 이것이 바로 여기서 일어난 일입니다.

Grep은 일부 null 바이트로 시작하는 파일을 확인합니다. 파일을 바이너리로 올바르게 보고합니다.

를 호출하여 GNU grep에게 파일을 텍스트로 처리하도록 지시할 수 있습니다 grep -a. null 바이트를 포함하여 전체 파일을 검색합니다(일치하지 않으므로 첫 번째 줄에 일치하지 않는 한 결과에 영향을 주지 않지만, 너무 많으면 속도가 느려질 수 있습니다).

더 나은 해결책은 tee항상 파일의 현재 끝 부분에 쓰도록 지시하는 것입니다. 다행히 (스테판 차젤라스는 이렇게 말했다.), 이에 대한 옵션이 있습니다: tee -a(모든 POSIX 호환 시스템에 존재) 먼저 파일을 잘라야 합니다.

>output.txt
nc -l -k -p 9100 | tee -a output.txt

¹ 대부분의 파일 시스템에서는 완전히 null 바이트로 구성된 블록이 할당되지 않은 상태로 유지되도록 허용합니다. 이러한 특수한 압축 방법을스파스 파일.

관련 정보