Fichier:
O000000667520994000000074720121112000000N^@^@^@
J'ai utilisé la commande ci-dessous mais cela ne fonctionne pas.
grep "^@^@^@" *
Fichier:
O000000667520994000000074720121112000000N^@^@^@
J'ai utilisé la commande ci-dessous mais cela ne fonctionne pas.
grep "^@^@^@" *
Réponses:
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' ...
grep -Pv '\x00' file
ne fonctionne pas dans Cygwin ...
-a
(parfois?) il ne trouve même pas le motif. Merci! Pourrait également aider @pbies.
^@
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 \0
C.
Ici, j'ai créé un fichier contenant un octet NUL. † Notez que j'utilise cat -v
pour 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.
En bash, vous pouvez ajouter des caractères spéciaux avec le préfixe C-q
ou 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.
^ @ est le caractère NUL. Que voulez-vous faire avec les lignes de vos fichiers qui le contiennent?
Vous pouvez jeter un oeil à /programming/2398393/identifying-and-removing-null-characters-in-unix qui traite d'une question similaire.
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
, xxd
ou ainsi) et grep dans la sortie de celui-ci. Mais franchement, il serait difficile de bien faire les choses.
-a
option, sinongrep
pense qu'il s'agit de données binaires et n'affichera pas les lignes correspondantes.