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)

Linux Professional Institute Certificate. LPIC-1

Lpic1 large.gif
Certificat LPIC-1
Examen: 101 (torneu a la resta de temes)
Fitxers: LPI103.2_Processar_fluxos_text_amb_filtres.pdf (LPI103.2_Processar_fluxos_text_amb_filtres.odp)
Objectius: http://www.lpi.org/eng/certification/the_lpic_program/lpic_1/exam_101_detailed_objectives
Dipòsit SVN: https://svn.projectes.lafarga.cat/svn/lpi/Materials/Examen_101/103.2
Usuari: anonymous
Paraula de pas: qualsevol paraula de pas

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

Coreutils és un paquet que instal·la tot l'imprescindible per treballar.

Sistemes Debian

man i info

Coreutils és un paquet de GNU

Les ordres de coreutils tenen tant man com info.

Al tractar-se però d'eines de GNU, trobareu més informació a les pàgines info.

Cal tenir en compte que per consultar les pàgines info cal:

$ info coreutils cat

Ordres

Opcions comunes a totes les aplicacions GNU

cat

cat (concatenate)

Concatena fitxers

$ cat numeros persones
10
9
15
ana
pep
Josep
$ cat primer.txt
segon.txt > combinat.txt

Resultat a la sortida estàndard

Suporta un nombre arbitrari de fitxers:

$ cat fitxer1.txt fitxer2.txt fitxer3.txt ...

Pot concatenar només un fitxer --> Consultar el fitxer:

$ cat /etc/passwd

Per a fitxers grans és més recomanable un "paginador" com les ordres more i less.

Opcions

Mostrar on s'acaben les línies (--show-ends) amb un dolar:

$ cat -E fitxer1 fitxer2

Mostrar números de línia:

$ cat -n fitxer2

Comprimir múltiples línies en blanc (-s o--squeezeblank):

$ cat -s fitxer amb espais

Mostrar caràcters especials. Per exemple el tabulador:

$ cat -T fitxer3
1^Iun
2^Idos
3^Itres
4^Iquatre
Els tabuladors es mostren com ^I. El fitxer original és:
$ cat fitxer3
1       un
2       dos
3       tres
4       quatre


Combinar fitxers amb cat

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

$ cat

Utilitzar la entrada estàndard. Caràcter -

$ echo "--------" | cat numeros1 - numeros2
1
2
3
--------
un
dos
tres
$ cat numeros1 - numeros2 < numeros3
1
2
3
4
1 un
2 dos
3 tres
4 quatre
un
dos
tres
quatre

tac

L'ordre tac concatena al reves

$ tac fitxer2.txt fitxer1.txt > combinat.txt

cut

cut = tallar

Extreu porcions de text de les línies de l'entrada estàndard i les mostra per la sortida estàndard.

3 opcions:

  • Per bytes: opció -b (--bytes=list) extreu la llista de bytes especificats del fitxer d'entrada.
  • Per caràcters: opció -c (--characters=list) extreu la llista de caràcters especificats. Bytes i caràcters acostumen a ser el mateix a no ser que s'utilitzi una codificació de caràcters multibyte.
  • Per camps: opció -f (--fields=list) mostra la llista de camps especificats del fitxer d'entrada. Per defecte el separador de camps és el tabulador. Es poden especificar altres separadors de camp amb l'opció -d char o --delim=char o --delimiter=char.

Exemples de llistes:

2: Especifica el segon camp, caràcter o byte

2-6: Un rang (de 2 a 6)

-4 o 4- o 4+: un rang obert

Extreure els camps 3 i 5 d'un fitxer separat per:

$ cut -d: -f3,5 /etc/passwd

Altres exemples:

$ date | cut -c12-19
6:48:25
$ ifconfig eth0 | grep HWaddr | \
cut -d “ “ -f 11
00:0C:76:96:A3:73

Opcions:

-s o --only-delimited: cut no mostra les línies que no contenen el delimitador en cas d'extracció de camps.

Exemple 1: Ens mostra el dia de la semana

#!/bin/bash
DIA=$(date | cut -c1-2)
echo $DIA

Exemple 2: Ens mostra la MAC de la targeta eth0

#!/bin/bash
MAC=$(ifconfig eth0 | grep HWaddr | cut -d " " -f 11)
echo $MAC

expand

Converteixen tabuladors en espais i viceversa:

Permet agrupar una sèrie d'espais en tabuladors

Els tabuladors són més útils que els espais per tal de navegar còmodament pels fitxers

unexpand: espais a tabuladors

expand: tabuladors a espais

$ echo " asdf sdf" | unexpand |cat -T -
^I^I asdf sdf

fmt

Permet formatar fitxers

Formata paràgrafs, amb línies massa llargues

La mida màxima d'una línia és 75 caràcters.

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

$ fmt -w 30 tirant
Molt excel·lent, virtuós
e gloriós Príncep, Rei
expectant: Jatsia per vulgada
fama fos informat de vostres
virtuts, molt majorment ara
he hagut notícia d'aquelles,
per vostra senyoria voler-me
.....

head

Mostren l'inici (head=cap) i el final (tail=cua) d'un fitxer

10 línies per defecte.

Es pot modificar la quantitat d'informació mostrada per número de línies o per mida:

• Per mida en bytes. -c num o --bytes=num: Mostra els primers num bytes

• Per número de línies. -n num o --lines=num: Mostra les primeres num línies.

Fitxers de log:

$ sudo head /var/log/syslog
[sudo] password for hugo: 
May  9 11:01:46 hugo-ESPRIMO-P rsyslogd: [origin software="rsyslogd" swVersion="5.8.1" x-pid="741" x-info="http://www.rsyslog.com"] rsyslogd was HUPed
May  9 11:02:40 hugo-ESPRIMO-P anacron[1070]: Job `cron.daily' terminated
May  9 11:02:40 hugo-ESPRIMO-P anacron[1070]: Job `cron.weekly' started
May  9 11:02:40 hugo-ESPRIMO-P anacron[5027]: Updated timestamp for job `cron.weekly' to 2012-05-09
May  9 11:02:48 hugo-ESPRIMO-P anacron[1070]: Job `cron.weekly' terminated
May  9 11:02:48 hugo-ESPRIMO-P anacron[1070]: Normal exit (2 jobs run)
May  9 11:09:01 hugo-ESPRIMO-P CRON[5048]: (root) CMD (  [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) ! -execdir fuser -s {} 2>/dev/null \; -delete)
May  9 11:09:02 hugo-ESPRIMO-P CRON[5047]: (CRON) info (No MTA installed, discarding output)
May  9 11:15:01 hugo-ESPRIMO-P CRON[5062]: (www-data) CMD ([ -f /usr/share/moodle/admin/cron.php ] && /usr/bin/php -f /usr/share/moodle/admin/cron.php > /dev/null)
May  9 11:15:01 hugo-ESPRIMO-P CRON[5061]: (CRON) error (grandchild #5062 failed with exit status 1)
$ sudo tail /var/log/syslog
May  9 14:40:00 hugo-ESPRIMO-P dbus[809]: [system] Activating service name='org.freedesktop.SystemToolsBackends.GroupsConfig2' (using servicehelper)
May  9 14:40:00 hugo-ESPRIMO-P dbus[809]: [system] Activating service name='org.freedesktop.SystemToolsBackends.SelfConfig2' (using servicehelper)
May  9 14:40:01 hugo-ESPRIMO-P dbus[809]: [system] Successfully activated service 'org.freedesktop.SystemToolsBackends.SelfConfig2'
May  9 14:40:01 hugo-ESPRIMO-P dbus[809]: [system] Successfully activated service 'org.freedesktop.SystemToolsBackends.GroupsConfig2'
May  9 14:40:01 hugo-ESPRIMO-P dbus[809]: [system] Successfully activated service 'org.freedesktop.SystemToolsBackends.UsersConfig2'
May  9 14:45:01 hugo-ESPRIMO-P CRON[3574]: (www-data) CMD ([ -f /usr/share/moodle/admin/cron.php ] && /usr/bin/php -f /usr/share/moodle/admin/cron.php > /dev/null)
May  9 14:45:01 hugo-ESPRIMO-P CRON[3573]: (CRON) error (grandchild #3574 failed with exit status 1)
May  9 15:00:01 hugo-ESPRIMO-P CRON[3756]: (www-data) CMD ([ -f /usr/share/moodle/admin/cron.php ] && /usr/bin/php -f /usr/share/moodle/admin/cron.php > /dev/null)
May  9 15:00:01 hugo-ESPRIMO-P CRON[3755]: (CRON) error (grandchild #3756 failed with exit status 1)
May  9 15:01:48 hugo-ESPRIMO-P sudo: pam_ecryptfs: pam_sm_authenticate: /home/hugo is already mounted

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 els mostreu amb aquest tipus de comandes (recordeu l'ordre reset per fer neteja)

$ cat /bin/ls
$ od /bin/ls

Mostra fitxers binaris en octal i altres formats

Els fitxers de text també es poden mostrar amb od

Hi ha una codificació de caràcters:

La primera columna és la posició

La resta de columnes és el contingut

$ cat numeros
1
2
3
4
5
6
7
$ od numeros
0000000 005061 005062 005063 005064 005065 005066 005067 000012
0000017

Codificació ascii en octal

$ ascii -o
    0 NUL    20 DLE    40      60 0   100 @   120 P   140 `   160 p 
    1 SOH    21 DC1    41 !    61 1   101 A   121 Q   141 a   161 q 
    2 STX    22 DC2    42 "    62 2   102 B   122 R   142 b   162 r 
    3 ETX    23 DC3    43 #    63 3   103 C   123 S   143 c   163 s 
    4 EOT    24 DC4    44 $    64 4   104 D   124 T   144 d   164 t 
    5 ENQ    25 NAK    45 %    65 5   105 E   125 U   145 e   165 u 
    6 ACK    26 SYN    46 &    66 6   106 F   126 V   146 f   166 v 
    7 BEL    27 ETB    47 '    67 7   107 G   127 W   147 g   167 w 
   10 BS     30 CAN    50 (    70 8   110 H   130 X   150 h   170 x 
   11 HT     31 EM     51 )    71 9   111 I   131 Y   151 i   171 y 
   12 LF     32 SUB    52 *    72 :   112 J   132 Z   152 j   172 z 
   13 VT     33 ESC    53 +    73 ;   113 K   133 [   153 k   173 { 
   14 FF     34 FS     54 ,    74 <   114 L   134 \   154 l   174 | 
   15 CR     35 GS     55 -    75 =   115 M   135 ]   155 m   175 } 
   16 SO     36 RS     56 .    76 >   116 N   136 ^   156 n   176 ~ 
   17 SI     37 US     57 /    77 ?   117 O   137 _   157 o   177 DEL

Altres formats

Hexadecimal

$ od -t x numeros
0000000 0a320a31 0a340a33 0a360a35 00000a37
0000016
$ ascii -x
...
1 SOH 11 DC1 21 ! 31 1 41 A 51 Q 61 a 71 q
2 STX 12 DC2 22 " 32 2 42 B 52 R 62 b 72 r
3 ETX 13 DC3 23 # 33 3 43 C 53 S 63 c 73 s
4 EOT 14 DC4 24 $ 34 4 44 D 54 T 64 d 74 t
5 ENQ 15 NAK 25 % 35 5 45 E 55 U 65 e 75 u
6 ACK 16 SYN 26 & 36 6 46 F 56 V 66 f 76 v
7 BEL 17 ETB 27 ' 37 7 47 G 57 W 67 g 77 w

Decimal

$ od -t d numeros
0000000 171051569 171182643 171313717 2615
0000016
$ od -t a numeros
0000000 1 nl 2 nl 3 nl 4 nl 5 nl 6 nl 7 nl
0000016

join

Combina fitxers segons un camp

El camp per defecte és el primer

Camps separats per espais

$ cat telefons.txt
93-894-56-45 Linus Torvalds
977-44-45-34 Richard Stallman
93-144-56-51 Pepe Pardo Jeans
93-345-53-21 George Orwell
$ cat grups_telefons.txt
93-894-56-45 Grup1
977-44-45-34 Grup1
93-144-56-51 Grup3
93-345-53-21 Grup2

Podeu combinar els dos fitxers amb:

$ join telefons.txt grups_telefons.txt
93-894-56-45 Linus Torvalds Grup1
977-44-45-34 Richard Stallman Grup1
93-144-56-51 Pepe Pardo Jeans Grup3
93-345-53-21 George Orwell Grup2

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

  • -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.

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

Amb l'opció -o FORMAT' es poden especificar opcions més complexes per a la sortida (resultat de la comanda)

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

IMPORTANT: Cal que els dos fitxers tinguin els camps clau o camps a coincidir en el mateix ordre. Sovint s'utilitza prèviament la comanda sort per tal de complir amb aquest requisit.

nl

Mostra números de línia (number lines)

També hi ha opcions amb cat, però no són tant completes:

$ nl /etc/group
    1	root:x:0:
    2	daemon:x:1:
    3	bin:x:2:
    4	sys:x:3:
    5	adm:x:4:hugo
    6	tty:x:5:
    7	disk:x:6:
    8	lp:x:7:
    9	mail:x:8:
   10	news:x:9:
   11	uucp:x:10:
....

Estil de la numeració: Es pot canviar amb l'opció -b STYLE (--bodynumbering= STYLE). Els estils són:

• a: números a totes les línies • t: números a totes les línies no buides • n: sense números (per defecte a les capçaleres i als peus de pàgina) • pBRE: números només a les línies que coincideixen amb la expressió regular BRE

Suporta capçaleres i peus de pàgina

paste

Fusiona els continguts de dos fitxers en una sola línia:

$ paste telefons.txt grups_telefons.txt
93-894-56-45 Linus Torvalds 93-894-56-45 Grup1
977-44-45-34 Richard Stallman 977-44-45-34 Grup1
93-144-56-51 Pepe Pardo Jeans 93-144-56-51 Grup3
93-345-53-21 George Orwell 93-345-53-21 Grup2

Crear una sortida de dos columnes o dos files:

$ paste numeros numeros1
1    un
2    dos
3    tres
4    quatre
5    cinc
6    sis
$ paste -s numeros numeros1
1  2   3    4      5    6   7
un dos tres quatre cinc sis set

pr

pr = print

Prepara un text per a ser imprimit.

Afegir pàgines, capçaleres i peus de pàgina.

$ pr (nom.arxiu.per.imprimir) | lp

Opcions:

• Columnes múltiples. -numcols o --columns=numcols: permet crear un text de múltiples columnes

• Doble espai. -d o --double-space: doble espai entre línies.

sed

sed = (stream editor)

Editor de flux de dades que ens permet dur a terme transformacions bàsiques de text en un flux d'entrada (un fitxer o una entrada des d'una canonada).

Accions:

Com esborrar una línia d'un fitxer

Esborrar la línia 0 d'un fitxer:

$ sed -i '10d' file

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

Esborrar els tres últims caràcters d'un fitxer:

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

Com convertir un fitxer de DOS a UNIX i viceversa

Convertir de DOS a Unix

• Amb bash, per convertir de DOS a UNIX, escriviu:

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

• Premeu Ctrl-V seguit de Ctrl-M per obtenir el patró del símbolespecial.

• Per convertir de Unix a DOS:

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

Com modificar un fitxer, buscar i reemplaçar text

Cercar i reemplaçar només la primera coincidència de cada línia:

$ sed 's/2012/2013/' calendari-2012.txt > calendari-2013.txt

Cercar i reemplaçar totes les coincidències (g:global):

$ sed 's/2012/2013/g' calendari-2012.txt > calendari-2013.txt

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

Sintaxi:

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

Sintaxi 2:

$ sed [opcions] script-text [fitxer-entrada]

En els dos casos anteriors, [fitxer-entrada] és el camí (path) del fitxer que volem modificar. La comanda sed modifica el contingut d'un fitxer i envia els canvis per la sortida estàndard.

Sed funciona mitjançant un conjunt d'ordres. Les ordres les podem especificar directament amb script-text o, mitjançant el paràmetre -f, podem utilitzar un fitxer que contingui les ordres. Normalment el conjunt d'ordres especificades directament es posen entre cometes simples.

Algunes de les ordres més importants que podeu utilitzar amb sed són:

TAULA de SED

sort

sort=ordenar en anglès

Ordena les línies d’un fitxer d’entrada segons el criteri que indiquem.

Podem ordenar alfabèticament o numèricament, ascendentment o descendentment, definir la part de la línia que s’ha de considerar per ordenar, etc...

Ordenar un fitxer segons els contingut de tota la línia:

$ sort /etc/passwd | head
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
bin:x:2:2:bin:/bin:/bin/sh
colord:x:114:126:colord colour management daemon,,,:/var/lib/colord:/bin/false
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
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
hplip:x:111:7:HPLIP system user,,,:/var/run/hplip:/bin/false

Ordena 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

Ordena el resultat de ls -l /etc pel cinquè camp (la mida del fitxer) descendentment (paràmetre -r). Fem servir el separador de camps per defecte (un o més espais en blanc).

$ ls -l /etc | sort -k5 -n -r | more

Per ordenar un fitxer numèric:

$ cat numeros
10
23
3
4
54
8
12
11
34

Podem executar:

$ sort -g numeros

o

$ sort -n numeros

split

Empaquetar un fitxer en múltiples fitxers partits

tail

tr

Passar de majúscules a minúscules i viceversa

Eliminar un caràcter d'un fitxer

Passar un fitxer CSV a tabuladors

unexpand

uniq

Serveix per eliminar linies duplicades.

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

Si la utilitzem com una comanda normal no funciona per tant solament funciona amb la comanda sort al davant.

$ uniq shakespeare 
To
be
or
not
to
be
that
is
the
question

xargs

wc

wc = word count

wc compta les paraules, així com també pot comptar línies, caràcters i bytes.

Altres

awk

Scripts de xarxa

Exemples ALUMNES

grep