Processar cadenes de text (Linux)
Introducció
A Linux una part molt important són arxius de text, per tant conèixer eines per poder manipular aquests arxius i saber-les utilitzar és una característica bàsica que ha de tenir qualsevol administrador de sistemes.
Redireccions i canonades (pipes)
Una manera d’utilitzar programes molt útil a l’hora de treballar amb textos és utilitzar-los junts, i això ho podem fer amb “piping” i redireccions. Els programes de manipulació de text solen rebre dades des de l’entrada estàndard (stdin), l’envien a la sortida estàndard (stdout) i treuen els errors per la sortida d’error estàndard (stderr). Si no s’especifica el contrari l’stdin serà el teclat i l’stout i stderr mostrarà el text per pantalla.
Exemple
Si fem cat sense donar-li paràmetres, agafarà text de l’stdin (teclat) i el mostrarà per stdoud (pantalla).
$ cat
Això és una prova
Això és una prova
Aquí és on entren en joc les redireccions amb els caràcters “|”, “>” i “<”. Utilitzant el mateix exemple de cat, si volem redireccionar el contingut a un arxiu en comptes de a la pantalla, utilitzarem “>”:
$ cat > arxiu-de-text
Això és una prova
Aquest text es guardarà a l'arxiu
Per sortir fem Ctrl+c
^C
$ cat arxiu-de-text
Això és una prova
Aquest text es guardarà a l'arxiu
Per sortir fem Ctrl+c
Per tant, l’operador “>” redirigeix la sortida del programa. Val a comentar que si utilitzem dos cops l’operador “>>” no sobreescriurà el contingut d’un arxiu, sinó que l’afegirà desprès del contingut que ja hi hagi.
Per redireccionar la sortida d’un programa a un altre podem utilitzar canonades “|”, com en el següent exemple:
$ cat text
Això és una prova
aquesta línia no s'ha de mostrar
Aquesta línia si prova
aquesta tampoc
$ cat text | grep prova
Això és una prova
Aquesta línia si prova
En aquest exemple tenim un arxiu de text creat. Al fer un cat ens mostra el contingut per pantalla, però al afegir-li una canonada, passem la sortida a la comanda grep, que filtrarà per les línies que continguin l’string prova.
Processant fluxes de text
Llegir un arxiu comprimit
Crearem un arxiu comandes.txt amb el següent contingut:
bzcat
cat
cut
head
less
md5sum
nl
od
paste
sed
sha256sum
sha512sum
sort
split
tail
tr
uniq
wc
zxcat
zcat
I filtrarem per les comandes que tinguin cat:
$ grep cat comandes.txt
bzcat
cat
zxcat
zcat
Ara comprimirem aquest arxiu amb gzip.
$ gzip comandes.txt
$ ls
comandes.txt.gz
I veurem el seu contingut amb zcat:
$ zcat comandes.txt.gz
bzcat
cat
cut
head
less
md5sum
nl
od
paste
sed
sha256sum
sha512sum
sort
split
tail
tr
uniq
wc
zxcat
zcat
Veure un arxiu paginat
A vegades hi ha arxius masssa grans per mostrar en una sola pantalla. Per això podem utilitar la comanda less, que mostrarà l’arxiu paginat.
Obtenir una part d’un arxiu de text
Per veure només l’inici d’un arxiu, tenim la comanda head. Per veure només el final, tenim la comanda tail. Les dues per defecte mostraran 10 línies.
$ head comandes.txt
bzcat
cat
cut
head
less
md5sum
nl
od
paste
sed
$ tail comandes.txt
sha512sum
sort
split
tail
tr
uniq
wc
zxcat
zcat
Per especificar que només volem un número de línies, amb ambdues comandes es fa amb el paràmetre -n seguit del número de línies:
$ head -n5 comandes.txt
bzcat
cat
cut
head
less
I per comptar el número de línies, redireccionarem la sortida a wc amb el paràmetre -l:
head comandes.txt | wc -l
10
Fundaments de sed
La majoria del que es pot fer amb grep també les podem fer amb sed. Per exemple, per llistar les línies que contenen cat dins un arxiu, fem:
$ sed /cat/d < comandes.txt
bzcat
cat
zxcat
zcat
On hem utilitzat el signe “<” per dirigir el contingut de l’arxiu comandes.txt a la comanda sed. La paraula entre barres (/) és el terme que busquem, i el paràmetre -n diu a sed que no torni tota la sortida.
Per defecte, la comanda sed retorna totes les línies. Per això afegim el paràmetre -n, perquè només retorni les línies que ens interessen. Si no l’afegim, ens retornaria el contingut de l’arxiu amb les línies que hem filtrat duplicades.
Un ús comú de sed és reemplaçar text en un arxiu. Per exemple, si tenim un arxiu animals.txt:
lleo
tigre
gat
gall
ànec
I volem canviar gat per gos, fem:
$ sed s/gat/gos/ < animals.txt
lleo
tigre
gos
gall
ànec
Ara si volem realitzar el canvi creant un altre arxiu farem: #+begin_src $ sed -i.backup s/gat/gos/ animals.txt $ ls animals.txt animals.txt.backup #+end_src+ On animals.txt conté l’arxiu editat i animals.txt.backup contñé l’arxiu original. Si posem la opció -i sense afegir .backup, sed sobreescriurà l’arxiu original.
Garantir la integritat de les dades
Quan es comparteix un arxiu, és molt recomanat revisar que la còpia que s’ha rebut sigui original i no hagi estat modificada. Això es fa amb valors de suma de comprovació.
Per fer aquest càlcul, tenim diversos algorismes. Per fer-lo amb sha 256, utilitzarem la comanda sha256sum:
$ sha256sum ARXIU > arxiu.txt
On hem calculat la suma de l’arxiu i la hem emmagatzemat a arxiu.txt.
Buscant més als arxius
La comanda od (octal dump) s’utilitza per depurar aplicacions i diferents arxius. La comanda sola enumerarà el contingut d’un arxiu en format octal.
$ od arxiu-de-text
0000000 064501 141570 020262
od té la opció -x, que mostra el contingut en hexadecimal.
I fins aquí el post d’avui. Si t’ha semblat útil pots deixar un comentari i compartir-lo. Ens veiem al següent!