Pillole Linux: ancora grep

Eccoci ad un’altra puntata sul (potentissimo) programma grep GNU Regular Expression Parser – Analizzatore di Espressioni Regolari GNU (le altre puntate le trovate qui e qui).

L’output atteso di grep durante una ricerca può presentarci qualche sorpresa nel caso interpreti il file come binario

Se grep interpreta il file come binario e non come testo, anziché scrivere sullo standard output le linee contenenti le occorrenze del pattern cercato, scriverà un più laconico:

$ grep needle filename
Il file binario filename corrisponde

Però il file può effettivamente contenere del testo analizzabile, per cui possiamo forzare questo comportamento (quello di stampare le occorrenze della stringa needle) aggiungendo una opzione:

$ grep -a needle filename
 12:01:16.360		[VxmlLog.L1]         		LOG: logXML: message:  \volume=20   How do I find a needle inside a haystack?  \pause=0?

Come si vede, l’output di grep è quello atteso: la riga contenente la stringa cercata. L’opzione -a ha il significato di indicare a grep di trattare il file binario come se fosse un file di testo, come si legge dalla man page:

$ man grep
 -a, --text
        Process a binary file as if it were text; this is  
        equivalent to the --binary-files=text option.

Rimane la domanda: perché grep interpreta come binario un file che è evidentemente un file di testo (è un log di una applicazione)?

Il file in oggetto è codificato con la codifica ISO-8859-1 quindi non è un file tecnicamente di puro testo, visto che è stata operata la codifica detta per rappresentare caratteri oltre il settimo bit:

$ file filename
filename: ISO-8859 text, with very long lines, with CRLF line terminators

In ultima analisi è il programma stesso che stabilisce cosa considerare come testo o come non-testo. Infatti la direttiva POSIX è abbastanza generosa a riguardo:

A file that contains characters organized into zero or more lines. The lines do not contain NUL characters and none can exceed {LINE_MAX} bytes in length, including the <newline> character. Although POSIX.1-2017 does not distinguish between text files and binary files (see the ISO C standard), many utilities only produce predictable or meaningful output when operating on text files. The standard utilities that have such restrictions always specify "text files" in their STDIN or INPUT FILES sections

Anche se POSIX.1-2017 non distingue tra file di testo e file binari, molte utilities [come ad esempio grep] producono solamente un output attendibile o sensato quando operano su file di testo. Le utilities standard che hanno questo tipo di restrizione specificano sempre “file di testo” nel loro sezioni STIDIN o INPUT FILES.

Lascia un commento

Your email address will not be published.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.