So suchen Sie nach dem Sonderzeichen NUL (^ @ ^ @ ^ @)

26

Datei:

O000000667520994000000074720121112000000N^@^@^@ 

Ich habe den folgenden Befehl verwendet, aber er funktioniert nicht.

grep "^@^@^@" *

quelle

Antworten:

52

Sie können im Perl-Regexp-Modus (-P) anhand des Hex-Codes nach beliebigen Zeichen suchen, einschließlich Steuerzeichen und nicht druckbaren Zeichen:

grep -Pa '\x00' ...
Gast
quelle
5
Möglicherweise möchten Sie eine -aOption hinzufügen , da grepdies ansonsten Binärdaten sind und die übereinstimmenden Zeilen nicht angezeigt werden.
mpy
Ich kann nicht überprüfen, ob die Datei nur ASCII = 0 Bytes enthält ... grep -Pv '\x00' filefunktioniert nicht in Cygwin ...
pbies
@mpy Ohne -a(manchmal?) findet es nicht einmal das Muster. Vielen Dank! Könnte auch @pbies helfen.
Michel de Ruiter
13

^@ist kein Karat ^und At -Zeichen @, es ist ein Charakter. So zeigen einige Programme das Zeichen NUL an - ASCII-Wert 0, auch bekannt als \0C.

Hier habe ich eine Datei mit einem NUL-Byte erstellt. Beachten Sie, dass ich cat -vnicht druckbare Zeichen anzeige.

$ 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

Grep hat Probleme, NULs zu finden, da sie zum Beenden von Strings in C. Sed verwendet werden.

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

Drücken Sie in vi im Einfügemodus Ctrl- V, Ctrl- Shift- @, um ein Null-Byte einzufügen.

John Kugelman unterstützt Monica
quelle
3

Wenn grep -Pdies nicht funktioniert (z. B. unter OS X), versuchen Sie Folgendes:

grep -E '\x00' ...
robinst
quelle
Sind Sie sicher, dass das funktioniert? Ich nicht mit meiner Version: grep (GNU grep) 2.14
guettli
3
Diese Antwort ist für BSD grep, probieren Sie die beste Antwort für GNU grep:grep -Pa '\x00' ...
robinst
1

In bash können Sie Sonderzeichen mit dem Präfix C-qoder hinzufügen C-v. So können Sie zum Beispiel

grep 'Ctrl-vCtrl-a' file.txt

Die Suchzeichenfolge sollte als control key+ gelesen werden character v, gefolgt von control key+ character a, das nach dem ASCII-Wert SOH (01) sucht. Leider funktioniert dies nicht für den NUL-Charakter.

Olaf Dietsche
quelle
Vermutlich meinst du eigentlich nicht, dass eine solche Zeichenfolge wörtlich ausgeschrieben, sondern logisch über die Tastatur eingegeben werden soll?
Leichtigkeit Rennen mit Monica
Ja natürlich. Dies ist die Steuertaste, die gedrückt gehalten wird, drücken Sie v, halten Sie dann die Steuertaste gedrückt und drücken Sie a.
Olaf Dietsche
Ich denke, das ist in Ihrer Antwort unklar.
Leichtigkeit Rennen mit Monica
@LightnessRacesinOrbit Danke für den Hinweis. Ich habe versucht, in der Antwort zu klären.
Olaf Dietsche
@ JohnKugelman Danke für die Bearbeitung. Scheint, ich hätte mir die Hilfe genauer ansehen sollen.
Olaf Dietsche
-3

Das Zeichen ^ @ ist das NUL-Zeichen, daher befürchte ich, dass es nicht direkt abgegriffen werden kann.

Ihre beste Option wäre wahrscheinlich, ein einfaches Programm zu schreiben, das nach dieser Folge von Bytes sucht.

Alternativ können Sie versuchen, es in irgendeine Form von Hex - Dump (zu konvertieren od, xxdoder so) und grep in den Ausgang davon. Aber ehrlich gesagt, wäre es schwierig, es richtig zu machen.

Rodrigo
quelle