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

26

Fichier:

O000000667520994000000074720121112000000N^@^@^@ 

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

grep "^@^@^@" *

la source

Réponses:

52

Vous pouvez rechercher tous les caractères, y compris les caractères de contrôle / non imprimables en mode perl-regexp (-P) par son code hexadécimal:

grep -Pa '\x00' ...
Client
la source
5
Vous voudrez peut-être ajouter une -aoption, sinon greppense qu'il s'agit de données binaires et n'affichera pas les lignes correspondantes.
mpy
Je ne peux pas trouver un moyen de vérifier si le fichier contient uniquement ASCII = 0 octets ... grep -Pv '\x00' filene fonctionne pas dans Cygwin ...
pbies
@mpy Sans -a(parfois?) il ne trouve même pas le motif. Merci! Pourrait également aider @pbies.
Michel de Ruiter
13

^@n'est pas un carat ^et un signe @, c'est un caractère. C'est ainsi que certains programmes affichent le caractère NUL - la valeur ASCII 0, également appelée \0C.

Ici, j'ai créé un fichier contenant un octet NUL. Notez que j'utilise cat -vpour afficher des 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 utilisés pour terminer les chaînes dans C. Sed, cependant, peut faire le travail:

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

En vi, en mode insertion, appuyez sur Ctrl- V, Ctrl- Shift- @pour insérer un octet nul.

John Kugelman soutient Monica
la source
3

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

grep -E '\x00' ...
Robinst
la source
Êtes-vous sûr que cela fonctionne? Je ne fais pas avec ma version: grep (GNU grep) 2.14
guettli
3
Cette réponse est pour grep BSD, essayez la meilleure réponse pour grep GNU:grep -Pa '\x00' ...
robinst
1

En bash, vous pouvez ajouter des caractères spéciaux avec le préfixe C-qou C-v. Vous pouvez donc, par exemple

grep 'Ctrl-vCtrl-a' file.txt

La chaîne de recherche doit être lue comme control key+ character v, suivi de control key+ character a, qui recherche la valeur ASCII SOH (01). Malheureusement, cela ne fonctionne pas pour le caractère NUL.

Olaf Dietsche
la source
Vraisemblablement, vous ne voulez pas vraiment dire qu'une telle séquence de caractères doit être écrite littéralement, mais plutôt saisie logiquement au clavier?
Courses de légèreté avec Monica
Oui bien sûr. Il s'agit de la touche de contrôle enfoncée, appuyez sur v, puis maintenez enfoncée la touche de contrôle, appuyez sur a.
Olaf Dietsche
Je pense que cela n'est pas clair dans votre réponse.
Courses de légèreté avec Monica
@LightnessRacesinOrbit Merci pour cet indice. J'ai essayé de clarifier la réponse.
Olaf Dietsche
@JohnKugelman Merci pour la modification. Il semble que j'aurais dû examiner l'aide de plus près.
Olaf Dietsche
-3

Le caractère ^ @ est le caractère NUL, donc je crains qu'il ne puisse pas être saisi directement.

Votre meilleure option serait probablement d'écrire un programme simple qui recherche cette séquence d'octets.

Alternativement, vous pouvez essayer de le convertir en une certaine forme de vidage hexadécimal ( od, xxdou ainsi) et grep dans la sortie de celui-ci. Mais franchement, il serait difficile de bien faire les choses.

rodrigo
la source