IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

Objectius

103.2. Processar fluxos de text utilitzant filtres
Objective.jpg
  • Objectiu: Els candidats han de ser capaços d'aplicar filtres a fluxos de text.
  • Pes: 3
060317 Icon - Theory of Knowledge v01 pdc.jpg

Àrees Clau de Coneixement:

  • Enviar fitxers de text i fluxos de sortida a través de filtres processadors de textos per a modificar la sortida utilitzant les instruccions estàndard UNIX incloses al paquet textutils de GNU.
Icon list.jpg

La següent és una llista parcial de fitxers, termes i utilitats utilitzades:

Text-editor.svg

Apunts: LPI 103.2. Processar fluxos de text utilitzant filtres

Paquet textutils

Sistemes Debian

Forma part de les aplicacions bàsiques del sistema, i venen instal·lades de fàbrica.

Abans hi havia un paquet anomenat coreutils (utilitats principals) que instal·lava les aplicacions bàsiques per treballar. Està dividit en 3 parts: Shellutils, Textutils i Fileutils.

Per instal·lar-lo, utilitzem:

$ sudo apt-get install coreutils

Però en teoria no fa falta, ja que ve instal·lat per defecte.

man i info

El coreutils és un paquet de GNU (podem veure ajuda amb la comanda man i la info).

$ man coreutils

o

$ info coreutils cat

Ordres

Opcions comunes a totes les aplicacions GNU

cat

L'eina cat (concatenate) uneix fitxers.

Utilització:

$ cat numeros.txt persones.txt 
4
8
15
16
23
42
kate
john
jack
ben
sawyer
hugo

Si no s'indica més d'un arxiu, el mostra en pantalla.

$ cat numeros.txt 
4
8
15
16
23
42

Hi trobem diferents opcions:

  • -E: Mostra on s'acaben les línies amb un dòlar.
$ cat -E numeros.txt 
4$
8$
15$
16$
23$
42$
  • -n: Mostra números de línia:
$ cat -n numeros.txt 
     1	4
     2	8
     3	15
     4	16
     5	23
     6	42
  • -s: Comprimeix múltiples línies en blanc.
  • -T: Mostra caràcters especials.
  • cat: Copia l'entrada estàndard a la sortida estàndard:
$ cat
dfg
dfg
dsa
dsa
sfga
sfga

L'ordre tac concatena al revés:

$ tac numeros.txt persones.txt 
42
23
16
15
8
4
hugo
sawyer
ben
jack
john
kate

Caràcter -:

$ echo "------" | cat numeros.txt - persones.txt 
4
8
15
16
23
42
------
kate
john
jack
ben
sawyer
hugo

Combinar fitxers amb cat

Copiar la entrada estàndard a la sortida estàndard

Utilitzar la entrada estàndard. Caràcter -

tac

cut

Retalla parts de text de l'entrada estàndard i les mostra per la sortida estàndard.

Té 3 opcions:

  • Per bytes: s'utilitza la opció -b per extreure la llista de bytes especificats del fitxer d'entrada.
  • Per caràcters: s'utilitza la opció -c per extreure la llista de caràcters especificats. Acostuma a ser el mateix que els bytes a no ser que s'utilitzi una codificació de caràcters multibyte.
  • Per camps: s'utilitza la opció -f per mostrar la llista de camps especificats del fitxer d'entrada. Per defecte, el separador de camps és el tabulador.

Exemple de llistes:

$ date
dc mai  9 12:17:52 CEST 2012
$ date | cut -d " " -f 1
dc
$ date | cut -d " " -f 2
mai
$ date | cut -d " " -f 3 

$ date | cut -d " " -f 4
9
$ date | cut -d " " -f 5
12:18:04
$ date | cut -d " " -f 6
CEST
$ date | cut -d " " -f 7
2012

//Pràctica: Fer un programa que mostri el dia actual\\

  • Creem un nou arxiu anomenat dia.sh:
$ nano dia.sh
  • Hi escrivim el següent text (codi):
 #!/bin/bash
 dia=$(date | cut -d " " -f 4)
 echo $dia
  • El desem i el fem executable amb la comanda:
$ sudo chmod u+x dia.sh 
  • L'executem:
$ ./dia.sh
9

Extreure unes determinades columnes d'un fitxer:

$ cut -d: -f3,5 /etc/passwd
0:root
1:daemon
2:bin
3:sys
4:sync
5:games
6:man
7:lp
8:mail
9:news
10:uucp
13:proxy
33:www-data
34:backup
38:Mailing List Manager
39:ircd
41:Gnats Bug-Reporting System (admin)
65534:nobody
100:
101:
102:
103:Avahi autoip daemon,,,
104:Avahi mDNS daemon,,,
105:usbmux daemon,,,
106:Gnome Display Manager
107:Speech Dispatcher,,,
108:Kernel Oops Tracking Daemon,,,
109:PulseAudio daemon,,,
110:RealtimeKit,,,
111:HPLIP system user,,,
112:
1000:joel barceló,Aula 20.3,977473565,615661813
1001:,,,
113:MySQL Server,,,
1002:,,,
1003:,,,
1004:,,,
1005:
1006:

Podem veure l'UID d'un usuari combinant les comandes cat i cut:

$ cat /etc/passwd | grep joel
joel:x:1000:1000:joel barceló,Aula 20.3,977473565,615661813:/home/joel:/bin/bash
$ cat /etc/passwd | grep joel | cut -d ":" -f 3
1000

//Pràctica: Fer un programa que mostri la MAC\\

  • Creem un nou arxiu anomenat mac.sh:
$ nano mac.sh
  • Hi escrivim el següent text (codi):
 #!/bin/bash
 mac=$(ifconfig eth0 | grep HWaddr | cut -d " " -f 11)
 echo $mac
  • El desem i el fem executable amb la comanda:
$ sudo chmod u+x mac.sh 
  • L'executem:
$ ./mac.sh
00:30:05:eb:a4:a2

expand

Les ordres expand i unexpand agrupen una sèrie d'espais en tabuladors o al contrari.

$ echo "                    hola joel   " | unexpand | cat -T -
^I^I    hola joel

fmt

Aquesta comanda permet formatar fitxers. Per exemple, formata paràgrafs amb línies massa llargues. Se solia utilitzar per imprimir amb antigues imnpressores. L'amplada d'un A4 és de 75 caràcters.

$ cat noutext.txt 
sdafdaskfjdskñfjdakslfjdsokñfjadsklñfjdsaklñfhsdalk jñfhdsñlfhdslkjñfhsdajlkfhsdñlkfhdskalfhs adklñfhsad klñfhsdaklñfh sa dklñfhsdaklñfhdskl ñfhksdlahfd  sklñfhsdaklñfhsadkl ñfhsdklfhds kñlfhkl sdñfhsakdlñfhsakñldfhsdklñ fhdsahfioerhfa oieoaihrd oiñharñ


Es pot canviar la mida màxima de línia amb la opció -w.

fmt -w 20 noutext.txt 
sdafdaskfjdskñfjdakslfjdsokñfjadsklñfjdsaklñfhsdalk
jñfhdsñlfhdslkjñfhsdajlkfhsdñlkfhdskalfhs
adklñfhsad
klñfhsdaklñfh sa
dklñfhsdaklñfhdskl
ñfhksdlahfd
sklñfhsdaklñfhsadkl
ñfhsdklfhds
kñlfhkl
sdñfhsakdlñfhsakñldfhsdklñ
fhdsahfioerhfa
oieoaihrd oiñharñ

IMPORTANT: S'ha de tenir em compte que no talla paraules, sinó espais en blanc.

head

La comanda head mostra l'inici d'un fitxer, mentre que la comanda tail mostra el final.

Es mostren 10 línies per defecte, però es pot modificar la quantitat d'informació mostrada per número de línies o per mida:

  • Per mida: S'utilitza -c num per mostrar els primers num bytes.
  • Per número de línies: S'utilitza -n num per mostrar les primeres num línies.

Exemple:

$ tail -f /var/log/syslog
May  9 12:48:16 joel-ESPRIMO-P dhclient: last message repeated 3 times
May  9 12:49:16 joel-ESPRIMO-P dhclient: last message repeated 5 times
May  9 12:50:16 joel-ESPRIMO-P dhclient: last message repeated 5 times
May  9 12:51:16 joel-ESPRIMO-P dhclient: last message repeated 4 times
May  9 12:52:16 joel-ESPRIMO-P dhclient: last message repeated 4 times
May  9 12:53:16 joel-ESPRIMO-P dhclient: last message repeated 5 times
May  9 12:54:16 joel-ESPRIMO-P dhclient: last message repeated 5 times
May  9 12:55:16 joel-ESPRIMO-P dhclient: last message repeated 6 times
May  9 12:56:16 joel-ESPRIMO-P dhclient: last message repeated 5 times
May  9 12:57:16 joel-ESPRIMO-P dhclient: last message repeated 5 times
$ tail -n 2 /var/log/syslog
May  9 12:56:16 joel-ESPRIMO-P dhclient: last message repeated 5 times
May  9 12:57:16 joel-ESPRIMO-P dhclient: last message repeated 5 times

od

Permet consultar fitxers binaris.

Els fitxer de tipus text es poden mostrar de forma senzilla per la línia de comandes amb comandes com cat, more o less. En canvi els fitxers binaris mostraran caràcters estranys (garbage characters) si es mostren amb aquest tipus de comandes.

$ od /bin/ls
0273660 001300 004006 071300 000001 006040 000000 000000 000000
0273700 000000 000000 000040 000000 000000 000000 000343 000000
0273720 000001 000000 000000 000000 000000 000000 071300 000001
0273740 000010 000000 000000 000000 000000 000000 000001 000000
0273760 000000 000000 000001 000000 000003 000000 000000 000000
$ cat /bin/ls
 ����� �������X��8���o���o����o���
������&�6�F�V�f�v���������Ɣ֔��������&�6�F�V�f�v���������ƕ֕��������&�6�F�V�f�v��

Tambés es poden mostrar fitxers binaris en octal i altres formats i podem veure fitxers de text amb aquesta comanda.

$ cat numeros.txt 
4
8
15
16
23
42
$ od numeros.txt 
0000000 005064 005070 032461 030412 005066 031462 032012 005062
0000020

Veure arxius en hexadecimal:

$ od -t x numeros.txt 
0000000 0a380a34 310a3531 33320a36 0a32340a
0000020

Veure arxius en decimal:

$ od -t d numeros.txt 
0000000   171444788   822752561   858917430   171062282
0000020
$ od -t a numeros.txt 
0000000   4  nl   8  nl   1   5  nl   1   6  nl   2   3  nl   4   2  nl
0000020

join

S'utilitza per combinar fitxers segons un camp.

El camp per defecte és el primer.

Exemple:

$ cat numeros.txt 
4 austen
8 locke
15 sheppard
16 linus
23 ford
42 reyes
$ cat persones.txt 
4 kate
8 john
15 jack
16 ben
23 sawyer
42 hugo
$ join persones.txt numeros.txt 
4 kate austen
8 john locke
15 jack sheppard
16 ben linus
23 sawyer ford
42 hugo reyes

Per defecte join utilitza el primer camp com a camp coincident. Es poden especificar altres camps de la següent forma:

  • -1 3 -2 2: El camp 3 del primer fitxer amb el camp 2 del primer fitxer.
  • -1 1 -2 1: Aquesta és la opció per defecte: el camp 1 del primer i segon fitxer.

Es pot fer que join ignori majúscules i minúscules (per defecte és case sensitive) amb l'opció -i.

Amb la opció -o FORMAT' es poden especificar opcions més complexes per a la sortida.

La comanda join és la comanda principal per manipular fitxers com a base de dades.

nl

paste

pr

La comanda pr (print) prepara un fitxer per a ser imprimit.

Es poden afegir pàgines, capçaleres i peus de pàgina amb la comanda:

$ pr nom_arxiu | lpr

Opcions:

  • Columnes múltiples: -numcols o --columns=numcols permet crear un text de múltiples columnes.
  • Doble espai: -d o '--double-space crea un doble espai entre línies.

sed

El sed (stream editor) és un editor de flux de dades que transforma el text en un flux d'entrada.

Entre altres coses, permet:

  • cercar/reemplaça.
  • suprimir una línia determinada.
  • Suprimir un conjunt de línies determinades.
  • Suprimier línies que coincideixin amb un patró determinat.
  • Afegir una línia després de cada línia d'un arxiu.

La sintaxi és:

$ sed [opcions] -f script-file [fitxer-entrada]

Amb la opció -f podem donar un guió d'accions que seguirà el sed per tal de modificar diferents aspectes d'un text.

Com esborrar una línia d'un fitxer

$ sed -i '10d' file

Com esborrar els últims caràcters (o els primers) de totes les línies d'un fitxer

$ sed 's/...$//' exemple.txt >> exemple_sense_tres_ultims_caracters.txt
$ sed 's/^..$//' exemple.txt >> exemple_sense_dos_primers_caracters.txt

Com convertir un fitxer de DOS a UNIX i viceversa

Amb bash, per convertir de DOS a UNIX, escrivim:

$ sed 's/^M$//' input.txt > output.txt

Premem Ctrl-V seguit de Ctrl-M per obtenir el patró del símbol especial.

Per convertir de Unix a DOS:

$ sed 's/$'"/`echo \\\r`/" input.txt > output.txt

També podem utilitzar tofrodos.

Símbols:

  • $: indica final de línia.
  • .: és el comodí, indica qualsevol caràcter.
  • ^: indica principi de línia.

Com modificar un fitxer, buscar i reemplaçar text

Com eliminar una secció d'un fitxer

Com reemplaçar una secció per un altre

Afegir un caràcter al final de totes les línies

extra characters after command

sort

La comanda sort ordena les línies d'un fitxer d'entrada segons el criteri que indiquem.

$ sort /etc/passwd
avahi-autoipd:x:103:108:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/bin/false
avahi:x:104:109:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false
backup:x:34:34:backup:/var/backups:/bin/sh
barcelo:x:1001:1001:,,,:/home/barcelo:/bin/bash
bin:x:2:2:bin:/bin:/bin/sh
cristiano:x:1003:1003:,,,:/home/cristiano:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
games:x:5:60:games:/usr/games:/bin/sh
gdm:x:106:114:Gnome Display Manager:/var/lib/gdm:/bin/false

Ordenar numèricament (-n) pel tercer camp (paràmetre -k3), considerant que el caràcter separador de camps és : (paràmetre -t:):

$ sort -t: -k3 -n /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh

Ordenar un fitxer numèric:

$ cat numeros.txt 
3
123
4
566
5
533
26
8
01234
0
2134
43
12
324
5435
34
4567
151356236
$ sort numeros.txt 
0
01234
12
123
151356236
2134
26
3
324
34
4
43
4567
5
533
5435
566
8
$ sort -g numeros.txt 
0
3
4
5
8
12
26
34
43
123
324
533
566
01234
2134
4567
5435
151356236
$ sort -n numeros.txt
0
3
4
5
8
12
26
34
43
123
324
533
566
01234
2134
4567
5435
151356236

sort i locales

$ sort provasort.txt
1
10
11
2
3
abcd
ABCD
america
bandera
Bandera
be
$ LANG=C; sort provasort.txt
1
10
11
2
3
ABCD
Bandera
abcd
america
bandera
be
$ LANG=en; sort provasort.txt
1
10
11
2
3
ABCD
Bandera
abcd
america
bandera
be


$ LANG=ca; sort provasort.txt
1
10
11
2
3
ABCD
Bandera
abcd
america
bandera
be

split

Serveix per dividir arxius.

$ cat numeros.txt 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ split -l 5 numeros.txt numeros
$ ls -la numeros*
-rw-r--r-- 1 joel joel 51 May 21 13:16 numeros.txt
-rw-r--r-- 1 joel joel 10 May 21 13:17 numerosaa
-rw-r--r-- 1 joel joel 11 May 21 13:17 numerosab
-rw-r--r-- 1 joel joel 15 May 21 13:17 numerosac
-rw-r--r-- 1 joel joel 15 May 21 13:17 numerosad

Empaquetar un fitxer en múltiples fitxers partits

tail

tr

La comanda tr (translate) serveix per modificar o eliminar caràcters de l'entrada estàndard.

Sintaxi:

$ tr [opcions] SET1 [SET2]

on:

  • SET1: El conjunt de caràcters a buscar per tal de ser reemplaçats.
  • SET2: El conjunt de caràcters que reemplaçaran al SET1.

Passar de majúscules a minúscules i viceversa

Eliminar un caràcter d'un fitxer

Passar un fitxer CSV a tabuladors

unexpand

uniq

La comanda uniq elimina línies successives.

Permet identificar duplicats.

$ cat shakespeare.txt 
To
be
or
not
to
be
that
is
the
question

Primer ordenem les paraules:

$ sort shakespeare.txt 
be
be
is
not
or
question
that
the
to
To

Amb la comanda uniq eliminem les línies duplicades:

$ sort shakespeare.txt | uniq
be
is
not
or
question
that
the
to
To

xargs

wc

La comanda wc (word count) compta les paraules, línies, caràcters o bytes d'un document.

Sintaxi:

$ wc shakespeare.txt 
10 10 40 shakespeare.txt

Per veure la longitud de la línia més llarga, utilitzem:

$ wc -L shakespeare.txt 
8 shakespeare.txt

Podem limitar la informació de la sortida de diferents maneres:

  • -l: mostra el número de línies.
$ wc -l shakespeare.txt 
10 shakespeare.txt
  • -w: mostra el número de paraules.
$ wc -w shakespeare.txt 
10 shakespeare.txt
  • -c: mostra el número de bytes.
$ wc -c shakespeare.txt 
40 shakespeare.txt
  • -m: mostra només els caràcters.
$ wc -m shakespeare.txt 
40 shakespeare.txt

Altres

awk

Scripts de xarxa

Exemples ALUMNES

grep