grep renvoie
Correspondances du fichier binaire test.log
Par exemple
echo "line1 re \x00\r\nline2\r\nline3 re\r\n" > test.log # in zsh
echo -e "line1 re \x00\r\nline2\r\nline3 re\r\n" > test.log # in bash
grep re test.log
Je souhaite que le résultat affiche line1 et line3 (total deux lignes).
Est-il possible d'utiliser tr
convertir les données non imprimables en données lisibles, pour permettre à grep de fonctionner à nouveau?
-e
laecho
commande?Réponses:
Vous pouvez exécuter le fichier de données, par
cat -v
exemplequi pourrait être ensuite post-traité pour supprimer le courrier indésirable; ceci est le plus similaire à votre requête sur l'utilisation
tr
pour la tâche.la source
man cat
dit à propos de-v
:-v, --show-nonprinting
use ^ and M- notation, except for LFD and TAB
set | cat -v | grep variable
grep --text
ne fonctionne pas toujours; il respecte CTRL + D en tant que terminateur de fichier. Donc, si vous l'avez dans votre fichier binaire, grep se fermera tôt.Ça ne peut pas être plus simple que ça.
la source
grep --text
que paxdiablo a mentionné 2 ans plus tôtLC_ALL="C" grep -a
Une façon est de simplement traiter les fichiers binaires comme du texte de toute façon,
grep --text
mais cela peut entraîner l'envoi d'informations binaires à votre terminal. Ce n'est pas vraiment une bonne idée si vous exécutez un terminal qui interprète le flux de sortie (tel que VT / DEC ou bien d'autres).Vous pouvez également envoyer votre fichier via
tr
la commande suivante:Cela changera tout ce qui est inférieur à un caractère d'espace (sauf le saut de ligne) et tout ce qui est supérieur à 126 en un
.
caractère, ne laissant que les imprimables.Si vous voulez que chaque caractère "illégal" soit remplacé par un autre, vous pouvez utiliser quelque chose comme le programme C suivant, un filtre d'entrée standard classique:
Cela vous donnera
{{NN}}
, oùNN
est le code hexadécimal du caractère. Vous pouvez simplement ajuster leprintf
pour le style de sortie souhaité.Vous pouvez voir ce programme en action ici, où il:
la source
tr '[:cntrl:] '.'
c'est mieux. Et cela devrait être\000-\010\013\014\016-\037\177-\377'
dans votre syntaxe tr.tr '[\000-\010\013\014\016-\037\177-\377]' '_'
réalisable, le cntrl ne convient pas à mon cas.cat
étape en accédant àgrep --text
autr
lieu de l'inverse. Cela vous permet également de greffer plusieurs fichiers et de conserver la référence du nom de fichier dans la sortie.Vous pouvez utiliser des "chaînes" pour extraire des chaînes d'un fichier binaire, par exemple
la source
Vous pouvez forcer grep à regarder les fichiers binaires avec:
Vous voudrez peut-être aussi ajouter
-o
(--only-matching
) pour ne pas avoir des tonnes de charabia binaire qui dérangeront votre terminal.la source
--only-matching
et que votre regex ne correspond pas à des données binaires arbitraires, vous n'aurez pas de problème.À partir de Grep 2.21, les fichiers binaires sont traités différemment :
Donc, ce qui se passe maintenant, c'est qu'avec les données binaires, tous les octets non textuels (y compris les retours à la ligne) sont traités comme des terminateurs de ligne. Si vous souhaitez modifier ce comportement, vous pouvez:
utiliser
--text
. Cela garantira que seules les nouvelles lignes sont des terminateurs de ligneutiliser
--null-data
. Cela garantira que seuls les octets nuls sont des terminateurs de lignela source
grep -a forcera grep à rechercher et à sortir d'un fichier que grep pense être binaire. grep -a re test.log
la source
Comme James Selvakumar l'a déjà dit,
grep -a
fait l'affaire. -a ou --text force Grep à gérer le flux d'entrée sous forme de texte. Voir la page de manuel http://unixhelp.ed.ac.uk/CGI/man-cgi?grepessayer
la source
tu peux faire
cela convertira la sortie de données sous forme de chaîne lisible en grep.
la source
Vous pouvez également essayer l' outil Word Extractor . Word Extractor peut être utilisé avec n'importe quel fichier de votre ordinateur pour séparer les chaînes contenant du texte / des mots humains du code binaire (applications exe, DLL).
la source
Voici ce que j'ai utilisé dans un système sur lequel la commande "strings" n'était pas installée
Cela imprime le texte et supprime les caractères non imprimables d'un seul coup, contrairement à "cat -v filename" qui nécessite un post-traitement pour supprimer les éléments indésirables. Notez que certaines des données binaires peuvent être imprimables, vous aurez donc toujours du charabia entre les bonnes choses. Je pense que les cordes suppriment également ce charabia si vous pouvez l'utiliser.
la source