^@
파일의 각 문자 사이에 문자가 포함된 300줄 파일이 있습니다 .
(보안상의 이유로 전체 내용을 게시할 수 없으므로 첫 번째 줄만 붙여넣겠습니다.)
[mercury@app01 ftp_logs]$ cat cl.txt
2015-01-22 03:00:01; local;
이제 파일을 보면 vi
동일한 내용이 표시됩니다.
2^@0^@1^@5^@-^@0^@1^@-^@2^@2^@ ^@0^@3^@:^@0^@0^@:^@0^@1^@;^@ ^@l^@o^@c^@a^@l^@;^@
cat
문자가 표시되지 않기 때문에 ^@
당연히 어떤 문자열에 대한 greping이 에서 작동할 것이라고 생각했지만 cat
놀랍게도 그렇지 않습니다.
[mercury@app01 ftp_logs]$ cat cl.txt
2015-01-22 03:00:01; local;
[mercury@app01 ftp_logs]$ cat cl.txt | grep local
[mercury@app01 ftp_logs]$
null 바이트를 로 바꾼 후 sed
이제 파일을 읽을 수 vi
있고 grep
에서 결과가 반환될 수 있습니다 cat
.
[mercury@app01 ftp_logs]$ sed -i 's/\x0//g' cl.txt
[mercury@app01 ftp_logs]$ cat cl.txt | grep local
2015-01-22 03:00:01; local;
[mercury@app01 ftp_logs]
질문:
1) grep
널 바이트가 표시되지 않기 때문에 널 바이트를 교체하기 전에 작동하지 않는 이유는 무엇입니까? 이는 grep
이러한 문자가 터미널에 표시되지 않더라도 표시된다는 의미입니까 ?^@
2) 파일을 꽤 잘 숨기는 것 같기 때문에 프로덕션 서버에서 파일을 사용 cat -v
하거나 읽는 것이 권장되는지 궁금합니다 .vi
cat
3) 해당 파일은 Windows 컴퓨터에서 자동으로 생성된 파일입니다. 어떤 상황에서 ^@
파일이 입력됩니까?
답변1
파일 형식은 리틀 엔디안 UTF-16일 수 있습니다. Windows의 일부 응용 프로그램은 기본적으로 이 작업을 수행하는 것으로 보이며 이로 인해 많은 이식성 문제가 발생합니다.
vi
ASCII-Nul(숫자 0) 값 바이트를 "^@"(control-At)로 나타냅니다. 실제로, vim
0 값 바이트를 입력하려면 control-shift-@ 코드를 사용할 수 있습니다.
grep
파일을 UTF-16으로 해석한 다음 "2" 또는 "0" 등에 대한 유니코드 코드 포인트를 살펴보는 대신 ACII-Nul 바이트를 살펴봐야 합니다. GNU 매뉴얼 페이지에는 grep
UTF를 처리할 수 있는 옵션이 없습니다 .
cat
ASCII-Nul bty는 표시되지 않고 문제의 터미널 에뮬레이터가 이를 표시하지만 사용하는 터미널 에뮬레이터는 이를 무시합니다. cat cl.txt | od -x
이상을 사용하는 경우 cat cl.txt | xxd
출력에 ASCII-Nul 바이트가 표시됩니다 cat
. 파일의 처음 2바이트에 "ffef" 또는 "efff"와 같은 내용이 표시되면 이는 상식에 반하여 Microsoft가 제정한 "바이트 순서 표시"입니다.
UTF-16을 ASCII나 UTF-8로 음역하는 데 무엇을 권장해야 할지 잘 모르겠지만 iconv
한번도 사용해 본 적이 없습니다.
답변2
예, 역할을
grep
바꾸세요^@
.cat
문자가 터미널에 인쇄되고 있지만 볼 수 없는 문자입니다. 이러한 문자를 볼 수 없다고 해서 해당 문자가 존재하지 않는다는 의미는 아닙니다.귀하의 선택/선호도는 귀하의 필요에 가장 적합한 것이 무엇인지에 따라 달라집니다. 하지만 이로 인해
vi
파일이 변경될 수 있다는 점을 명심하세요 .^@
타고난 성격은 아니다. Windows 프로그램은 이러한 문자를 적극적으로 여기에 배치합니다. 이유를 알아내려면 프로그래머에게 물어봐야 합니다. 대부분의 경우 Windows 프로그램에서는 문자의 너비가 16비트라고 가정하지만 Unix 시스템에서는 문자의 너비가 8비트라고 가정합니다.
답변3
나는 한때 같은 문제를 겪었습니다.
vi
파일 문자 집합에 대해 알아보세요.
당신이 사용하는 경우
file c1.txt
UTF-8 파일인지 ISO 파일인지 확인할 수 있습니다.
그 후 변환 유틸리티를 사용하여 변환할 수 있습니다.
echo file iso-8859-1 is converted to UTF in order to be emailed
iconv -f 'iso-8859-1' -t UTF-8 $MESGFILE >> $MESGENVIADO