文字はviでは見ることができますが、catでは見ることができません。

文字はviでは見ることができますが、catでは見ることができません。

^@ファイル内の各文字の間に文字を含む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ファイルを読み込んvigrepから結果を返すことができます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)grepNULLバイトが表示されないため、NULLバイトを交換する前に機能しないのはなぜですか?これはgrep、これらの文字が端末に表示されなくても表示されることを意味しますか?^@

2) ファイルをかなり隠すようなので、本番サーバーでファイルを使用またはcat -v読み取ることをお勧めします。vicat

3)ファイルはWindowsコンピュータで自動的に作成されたファイルです。どのような状況で^@ファイルが入力されますか?

ベストアンサー1

ファイル形式はリトルエンディアンUTF-16です。 Windows の一部のアプリケーションは既定でこれを行うように見え、これにより多くの移植性の問題が発生します。

viASCII-Nul(数値 0) 値バイトを "^@"(control-At) で表します。実際、vimゼロ値バイトを入力するには、control-shift-@ コードを使用できます。

grepファイルをUTF-16として解釈してから、「2」または「0」などのUnicodeコードポイントを見るのではなく、ACII-Nulバイトを見てください。 GNUのマニュアルページにはgrepUTFを処理するオプションはありません。

catASCII-Nul btyは表示されず、問題の端末エミュレータはそれを表示しますが、使用する端末エミュレータはそれを無視します。cat cl.txt | od -x以上を使用すると、cat cl.txt | xxd出力にASCII-Nulバイトが表示されますcat。ファイルの最初の2バイトに「ffef」や「efff」などの内容が表示される場合、これは常識に反してMicrosoftが制定した「バイト順表示」です。

UTF-16をASCIIまたはUTF-8に翻訳するために何をお勧めするのかわかりませんが、iconv一度も試したことはありません。

おすすめ記事