特殊文字NULをgrepする方法(^ @ ^ @ ^ @)


26

ファイル:

O000000667520994000000074720121112000000N^@^@^@ 

以下のコマンドを使用しましたが、機能しません。

grep "^@^@^@" *
linux  unix 

回答:


52

16進コードにより、perl-regexpモード(-P)で制御/非印刷文字を含む任意の文字をgrepできます。

grep -Pa '\x00' ...

5
-aオプションを追加したい場合grepがあります。そうしないと、バイナリデータであると判断され、一致する行が表示されません。
mpy

ファイルにASCII = 0バイトのみが含まれているかどうかを確認する方法が見つかりgrep -Pv '\x00' fileません... Cygwinでは機能しません
...-pbies

@mpyなしでは-a(場合によっては)パターンが見つかりません。ありがとう!@pbiesにも役立つかもしれません。
ミシェルドルイター

13

^@カラット^とアットマークではなく、@1文字です。これは、一部のプログラムがNUL文字(ASCII値0、\0C とも呼ばれる)を表示する方法です。

ここでは、NULバイトを含むファイルを作成しました。cat -v非印刷文字を表示するために使用していることに注意してください。

$ cat -v blah
hello
null^@
hi
$ hexdump -C blah
00000000  68 65 6c 6c 6f 0a 6e 75  6c 6c 00 0a 68 69 0a     |hello.null..hi.|
0000000f

Cで文字列を終了するために使用されるため、GrepはNULを見つけるのに問題があります。しかし、Sedは仕事をすることができます。

$ sed -n '/\x0/p' blah
null
$ sed -n '/\x0/p' blah | cat -v
null^@

VIに、挿入モードのプレスでCtrl- VCtrl- Shift- @ヌルバイトを挿入します。


3

grep -P動作しない場合(OS Xなど)、これを試してください:

grep -E '\x00' ...

これは確かに機能しますか?私のバージョンではありません:grep(GNU grep)2.14
guettli

3
この答えは、BSD grepのためである、GNU grepのためのトップの答えを試してください:grep -Pa '\x00' ...
robinst

1

bashでは、C-qまたはで始まる特殊文字を追加できますC-v。たとえば、次のことができます

grep 'Ctrl-vCtrl-a' file.txt

検索文字列は、ASCII値SOH(01)を検索するcontrol key+ character vに続いてcontrol key+ として読み取られる必要がcharacter aあります。残念ながら、これはNUL文字では機能しません。


おそらく、あなたは実際にそのような文字シーケンスが文字通り書き出されるべきではなく、代わりに論理的にキーボードで入力されるべきだということを意味しないのでしょうか?
モニカとライトネスレース

はい、もちろん。これは、Ctrlキーを押しながらvを押し、次にControlキーを押しながらaを押します。
オラフディーチェ

それはあなたの答えでは不明だと思います。
モニカとライトネスレース

@LightnessRacesinOrbitヒントをありがとう。私は答えを明確にしようとしました。
オラフディーチェ

@JohnKugelman編集ありがとうございます。ヘルプをもっと詳しく調べたほうがよさそうです。
オラフディーチェ


-3

文字^ @はNUL文字であるため、直接grepできないことを恐れています。

おそらく、このバイトシーケンスを検索する単純なプログラムを作成するのが最善の選択肢です。

あるいは、何らかの形式の16進ダンプ(odなどxxd)に変換して、その出力にgrepを試みることもできます。しかし、率直に言って、それを正しくするのは難しいでしょう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.