web-dev-qa-db-fra.com

Comment grep pour le caractère spécial NUL (^ @ ^ @ ^ @)

Fichier:

O000000667520994000000074720121112000000N^@^@^@ 

J'ai utilisé la commande ci-dessous mais cela ne fonctionne pas.

grep "^@^@^@" *
23
user1580770

Vous pouvez grep pour tout caractère, y compris les caractères de contrôle/non imprimables, en mode Perl-regex (-P) grâce à son code hexadécimal:

grep -Pa '\x00' ...
44
Guest

^@ n'est pas un carat ^ et at-sign @, c'est un caractère. C'est la façon dont certains programmes affichent le caractère NUL - valeur ASCII 0, également appelé \0 en C.

Ici, j'ai créé un fichier contenant un octet NUL. Notez que j'utilise cat -v pour afficher les caractères non imprimables.

$ 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 a du mal à trouver des NUL car ils sont habitués à terminer les chaînes de caractères en C. Sed peut toutefois faire le travail:

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

 Dans vi, en mode insertion, appuyez sur Ctrl-VCtrl-Shift-@ insérer un octet nul.

11
John Kugelman

Si grep -P ne fonctionne pas (par exemple sous OS X), essayez ceci:

grep -E '\x00' ...
2
robinst

Dans bash, vous pouvez ajouter des caractères spéciaux avec le préfixe C-q ou C-v. Donc vous pouvez, par exemple

grep 'Ctrl-vCtrl-a' file.txt

La chaîne de recherche doit être lue comme suit: control key + character v, suivie de control key + character a, qui recherche ASCII valeur SOH (01). Malheureusement, cela ne fonctionne pas pour le personnage NUL.

1
Olaf Dietsche