[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]


64. Gestione dei file presi byte per byte

Alcuni programmi si occupano di elaborare i file a livello di byte. Per esempio, può trattarsi di trasformazioni di caratteri singoli o di spazi in caratteri di tabulazione e viceversa. Comunque, a questo livello, non è detto che debba sempre trattarsi di file di testo puri e semplici.

Programma Descrizione
tr Esegue alcune trasformazioni sui caratteri.
expand Trasforma i caratteri di tabulazione utilizzando il carattere spazio.
unexpand Sostituisce una serie di caratteri spazio con tabulazioni.
sum Calcola un codice di controllo (obsoleto)
cksum Calcola un codice di controllo.
md5sum Calcola un codice di controllo MD5 (una firma MD5).

Tabella 64.1: Riepilogo dei programmi per la gestione dei file a livello di byte.

64.1 Conversione

Alcuni programmi consentono di convertire il contenuto di un file, operando a livello di byte. La situazione più comuni riguarda l'espansione dei caratteri di tabulazione, ovvero la loro trasformazione in caratteri spazio normali, nella quantità necessaria a mantenere le distanze previste, e nel senso opposto, la conversione inversa per ridurre la dimensione complessiva del file.

64.1.1 $ expand

expand [<opzioni>] [<file>...]

Emette attraverso lo standard output una trasformazione dei file forniti come argomento, in cui i simboli di tabulazione sono trasformati in spazi veri e propri. Se non viene specificato diversamente attraverso le opzioni, gli stop di tabulazione si intendono ogni otto caratteri.

Alcune opzioni

-t <tab1>[,<tab2>...] | --tabs=<tab1>[,<tab2>...]

Permette di specificare una tabulazione diversa da quella predefinita (ogni otto colonne). Se viene specificato solo un numero, si intende una tabulazione ogni n colonne, altrimenti, si intende una sequenza di stop di tabulazione, in cui la prima colonna corrisponde al numero zero. Una volta esaurito l'elenco, gli stop di tabulazione successivi vengono sostituiti con uno spazio singolo.

-n

Questa è una variante dell'opzione `-t', in cui si mette direttamente il numero corrispondente alla tabulazione che si vuole avere.

-i | --initial

Converte solo i caratteri di tabulazione iniziali, cioè quelli che precedono caratteri diversi da spazio, o che precedono altri caratteri di tabulazione.

Esempi

expand -8 pippo.txt > pippo1.txt

expand -t 8 pippo.txt > pippo1.txt

expand --tabs=8 pippo.txt > pippo1.txt

I comandi mostrati sopra sono equivalenti: servono tutti a espandere i caratteri di tabulazione del file `pippo.txt' generando il file `pippo1.txt', utilizzando intervalli di tabulazione ogni otto colonne. Il valore è stato specificato per completezza, dal momento che un intervallo di otto colonne è quello predefinito.

64.1.2 $ unexpand

unexpand [<opzioni>] [<file>...]

Emette attraverso lo standard output una trasformazione dei file forniti come argomento, in cui gli spazi sono trasformati in caratteri di tabulazione per quanto possibile. Se non viene specificato diversamente attraverso le opzioni, gli stop di tabulazione si intendono ogni otto caratteri. Normalmente, il programma trasforma solo gli spazi iniziali.

Alcune opzioni

-t <tab1>[,<tab2>...] | --tabs=<tab1>[,<tab2>...]

Permette di specificare una tabulazione diversa da quella predefinita (ogni otto colonne). Se viene specificato solo un numero, si intende una tabulazione ogni n colonne, altrimenti, si intende una sequenza di stop di tabulazione, in cui la prima colonna corrisponde al numero zero. Una volta esaurito l'elenco, non vengono fatte altre trasformazioni.

-a | --all

Non si limita a trasformare solo gli spazi iniziali.

64.2 Traslitterazione o cancellazione di caratteri

Un programma di utilità che spesso passa inosservato è molto importante nell'elaborazione di file a livello di byte singolo (o di carattere). Si tratta di `tr', il cui obiettivo fondamentale è quello di convertire un insieme di caratteri (o di simboli) in un altro insieme, oppure consente l'eliminazione di alcuni caratteri, oppure solo di quelli doppi. Dal momento che con `tr' è necessario distinguere tra situazioni differenti, è opportuno descrivere separatamente la sua sintassi. L'elenco di modelli sintattici che viene mostrato è semplificato rispetto alle possibilità effettive di `tr', e si deve considerare che l'input proviene dallo standard input e l'output viene emesso attraverso lo standard output.

64.2.1 Rappresentazione dei caratteri in una stringa di tr

Le stringhe utilizzate come argomenti di `tr' vanno scritte secondo una sintassi particolare, che assomiglia vagamente alle espressioni regolari. In generale, ogni carattere (lettera, numero, simbolo) rappresenta esattamente se stesso, salvo le eccezioni che vengono descritte qui.

Sono ammissibili delle sequenze di escape formate da una barra obliqua inversa seguita da un carattere o da un numero che deve essere inteso in modo ottale. La tabella 64.2 elenca queste sequenze di escape (si veda anche la sezione 125.1).

Codice Descrizione
\a <BEL>.
\b <BS>.
\f <FF>.
\n <LF>.
\r <CR>.
\t <HT> (tabulazione normale).
\v <VT>.
\nnn Il carattere corrispondente al codice ottale indicato.
\\ Una barra obliqua inversa singola.

Tabella 64.2: Sequenze di escape per le stringhe di `tr'.

Possono essere indicati degli intervalli di caratteri, attraverso la notazione `m-n'. Il carattere iniziale, m, deve essere precedente a quello finale, in base alla sequenza stabilita dalla codifica a cui si fa riferimento. A titolo di esempio, l'intervallo `0-4', è equivalente alla sequenza di caratteri `01234'.

È possibile indicare una serie di caratteri ripetuti, attraverso una notazione particolare: `[x*n]'. Qui le parentesi quadre fanno parte della notazione: x è il carattere da ripetere n volte. Se si omette il numero, si intende una quantità indefinitamente grande. È probabile che non sia conveniente l'uso di questa forma, anche per non complicare inutilmente l'interpretazione umana degli argomenti di `tr'; tuttavia è necessario conoscerne l'esistenza, per poter leggere gli script realizzati da altri.

Possono essere indicate delle classi di caratteri, in modo simile alle espressioni regolari: `[:<classe>:]'. Le classi utili nella traduzione da un insieme all'altro sono solo `lower' e `upper', allo scopo di convertire le lettere minuscole in maiuscole, oppure per fare l'inverso. Tutte le altre classi possono servire solo per la cancellazione dei caratteri, dal momento che non si espandono in un modo ordinato e prevedibile.

In teoria, è ammissibile anche la notazione delle classi di equivalenza: `[=x=]', che però, allo stato attuale, nella realizzazione GNU di `tr' non serve a molto, dal momento che si traduce semplicemente nella stessa lettera indicata (x).

64.2.2 Traslitterazione

La traslitterazione è l'operazione più semplice da realizzare con `tr'; basta l'indicazione delle stringhe: quella di origine e quella di destinazione. Vengono mostrati alcuni esempi.

tr abc def < primo.txt > secondo.txt

Questo esempio mostra la lettura del file `primo.txt', che viene elaborato da `tr' in modo da trasformare ogni lettera «a» in «d», ogni lettera «b» in «e», e ogni lettera «c» in «f». Il risultato viene salvato nel file `secondo.txt'.

tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ < primo.txt > secondo.txt

tr a-z A-Z < primo.txt > secondo.txt

tr '[:lower:]' '[:upper:]' < primo.txt > secondo.txt

Questi tre esempi sono molto simili: quello che si vuole ottenere è la conversione delle lettere minuscole in maiuscole. Di sicuro, il modo più corretto per raggiungere questo risultato è quello di utilizzare l'ultima delle tre forme, dal momento che così si dovrebbe garantire la compatibilità con le proprie convenzioni locali, includendo correttamente anche le lettere accentate (che qui non sono state mostrate).

64.2.3 Cancellazione e compattamento

La cancellazione serve solo per eliminare dei caratteri, senza convertirli in qualche modo. Il comando seguente può essere utile per convertire un file di testo in cui il codice di interruzione di riga è in stile Dos, ovvero è composto dalla sequenza <CR><LF>.

tr -d '\r' < primo.txt > secondo.txt

In questo modo si elimina solo il codice <CR>, rappresentato dalla sequenza di escape `\r', è il risultato che si ottiene è quello di lasciare solo i codici <LF>, adatti nella maggior parte dei sistemi Unix. *1*

tr -s '\n' < primo.txt > secondo.txt

Con questo comando si vogliono eliminare le righe vuote multiple; tuttavia, non vengono eliminate le righe che sono semplicemente bianche, che cioè contengono degli spazi.

tr -c -s '[a-zA-Z0-9]' '[ *]' < primo.txt > secondo.txt

Questo esempio mostra l'uso dell'opzione di complemento (`-c'). In pratica, si vogliono identificare nella prima stringa tutti i caratteri che non siano alfanumerici (escludendo le lettere accentate), e si vuole che questi siano sostituiti da un carattere spazio. Per indicare tanti caratteri spazio quanti sono necessari nella seconda stringa, si utilizza la notazione speciale `[ *]' che ripete lo spazio in modo indefinito. Infine, gli spazi multipli vengono semplicemente eliminati.

tr -c -s '[a-zA-Z0-9]' '[\n*]' < primo.txt > secondo.txt

Come nell'esempio precedente, solo che invece di usare lo spazio per sostituire ciò che non è un carattere alfanumerico, si utilizza il codice <LF>, corrispondente al codice di interruzione di riga. Lo scopo è quello di individuare tutte le parole del testo e di ottenerne l'elenco, dove ognuna occupa una riga separata.

tr -c -s '[:alnum:]' '[\n*]' < primo.txt > secondo.txt

Questa variante precisa meglio l'intenzione di selezionare tutti i caratteri non alfanumerici, perché la stringa di cui si fa il complemento contiene l'indicazione della classe `alnum', che comprende anche le lettere accentate della propria localizzazione.

64.3 Controlli sommari

Alcuni programmi si occupano di calcolare valori di vario genere in base al contenuto dell'input. Può trattarsi del conteggio di determinati elementi o di codici di controllo (checksum).

64.3.1 $ sum

sum [<opzioni>] [<file>...]

`sum' calcola un codice di controllo a 16 bit per ogni file fornito negli argomenti. Emette attraverso lo standard output il valore ottenuto insieme alla dimensione (arrotondata) in blocchi. Il valore predefinito della dimensione dei blocchi è di 1024 byte.

Questo programma viene considerato obsoleto e al suo posto si preferisce utilizzare `cksum'

Alcune opzioni

-r

Utilizza l'algoritmo predefinito (compatibile con BSD).

-s | --sysv

Utilizza l'algoritmo compatibile con System V. In tal caso, i blocchi hanno una dimensione di 512 byte.

64.3.2 $ cksum

cksum [<opzioni>] [<file>...]

`cksum' calcola un codice di controllo CRC (Cyclic Redundancy Check) per ogni file fornito negli argomenti.

Non utilizza opzioni, tranne quelle standard.

64.3.3 $ md5sum

md5sum [<opzioni>] [<file>...]

`md5sum' calcola un codice di controllo MD5 (Message Digest) a 128 bit per ogni file fornito negli argomenti, oppure verifica la corrispondenza di una serie di codici di controllo accumulati precedentemente in un file, con i file relativi. In condizioni normali, `md5sum' emette una serie di righe nella forma:

<firma> <file>

Per esempio, una cosa del genere:

fdbf0c571fb4942a6c505d732e163876  a2ps.1.gz
f2c766c141c6e5bb55c8edf6ce4ecba6  ab.1.gz
00169ba95302aca74597f000b61c3255  access.1.gz
69cf0ef0436aff6830a8a8a11b53b27b  addftinfo.1.gz
...

Questa informazione può essere conservata per verificare in seguito se gli stessi file corrispondono sempre agli originali, oppure se sono stati danneggiati o manomessi. La verifica può essere manuale (visiva), oppure può essere lo stesso `md5sum' a verificarla, utilizzando per questo l'opzione `-c'.

Alcune opzioni

-c <file>

Utilizzando questa opzione, negli argomenti di `md5sum' si può indicare solo un file, e questo deve consistere nell'elenco di firme abbinate ai file corrispondenti: vengono ricalcolate le firme di questi file, e viene verificata la corrispondenza con le firme già annotate. In caso di differenza, viene emessa una segnalazione di errore.

-v

Genera maggiori informazioni.

Esempi

md5sum *.txt > firme

Raccoglie le firme MD5 di tutti i file che terminano con l'estensione `.txt'.

md5sum -c firme

Controlla tutti i file elencati nel file `firme' per verificare che il contenuto di questi non siano stato alterato in alcun modo.

---------------------------

Appunti Linux 2000.04.12 --- Copyright © 1997-2000 Daniele Giacomini --  daniele @ pluto.linux.it


1.) Peccato che il contrario non possa essere ottenuto con `tr'.


[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]