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

Contingut

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

Plantilla

Ordres

Paquet textutils

Sistemes Debian

En aquest tipus de sistemes, cal tenir en compte que el paquet textutils ara forma part de coreutils:

$ sudo apt-get install textutils
S'està llegint la llista de paquets... Fet 
S'està construint l'arbre de dependències       
S'està llegint la informació de l'estat... Fet
Nota: s'està seleccionant coreutils en comptes de textutils
coreutils ja es troba en la versió més recent.
0 actualitzats, 0 nous a instal·lar, 0 a suprimir i 0 no actualitzats.

El paquet coreutils inclou moltes més aplicacions que les necessàries per editar fitxers.

Per a més informació sobre el paquet coreutils consulteu l'article coreutils.

man i info

Alguns desenvolupadors prefereixen la comanda info en comptes de la comanda man. Les comandes de coreutils tenen tan man com info. Cal tenir en compte però que, per exemple:

$ man cat

i

$ info cat

Us mostraran la mateixa informació. Si voleu consultar el manual heu d'executar:

$ info coreutils cat

Podeu consultar informació general sobre coreutils amb:

$ info coreutils

Vegeu també els articles:

Opcions comunes a totes les aplicacions GNU

Totes les aplicacions de GNU accepten (ho haurien d'acceptar) les següents opcions:

  • Normalment les opcions i els operands poden aparèixer en qualsevol ordre. Per exemple és el mateix:
$ sort -r /etc/passwd -t :

és el mateix que:

$ sort -r -t : /etc/passwd

NOTA: Si la variable d'entorn POSIXLY_CORRECT està establerta, aleshores les opcions han d'aparèixer abans que els operands a no ser que s'especifiqui el contrari a l'ordre.

  • La majoria de programes GNU reconeixen les opcions --help (mostra exemples d'ús de l'ordre) i --version (mostra la versió de l'ordre).
  • La majoria d'ordre permeten utilitzar les opcions llargues de forma parcial si no hi han ambigüitats. Així és el mateix:
$ rmdir --ignore-fail-on-non-empty

que

$ rmdir --ignore-fail

o inclus:

$ rmdir --i
  • Per utilitzar operands o noms de fitxers que comencin oer -, cal utilitzar --. Exemple:
$ sort -- -r

Ordena un fitxer anomenat -r.

  • L'operand ‘-’ no és realment una opció. s'utilitza per indicar l'entrada estàndard (i en alguns casos la sortida estàndard)

Altres conceptes comuns:

  • Exit status: Indica si el programa ha funcionat de forma correcta o incorrecta
  • Backup options: -b -S en alguns programes
  • Block size: BLOCK_SIZE i --block-size en alguns programes
  • Signal specifications: opció --signal.
  • Traversing symlinks: -H, -L, or -P, in some programs.
  • Random sources: --random-source, in some programs.
  • Target directory:*: Specifying a target directory, in some programs.
  • Trailing slashes:*: --strip-trailing-slashes, in some programs.
  • Treating / specially:*: --preserve-root and --no-preserve-root.
  • Special built-in utilities: break, :, eval, ...
  • Standards conformance: Conformance to the POSIX standard.

Recursos:

cat

cat és l'abreviatura de concatenate. Per tant cat fa justament això, concatenar fitxers:

$ cat numeros persones 
10
9
4
15
20
34
ana
pep
josep
isabel
clara
ramona

Es pot combinar un número arbitrari de fitxers amb cat:

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

Sovint s'utilitza també per a veure el contingut d'un fitxer, amb:

$ cat /etc/passwd

En aquest sentit, per a fitxers grans és més recomanable un "paginador" com les comandes more i less.

Podem aplicar les següents opcions a cat:

Mostrar on s'acaben les línies:

Utilitzeu -E o --show-ends:

$ cat -E fitxer1 fitxer2
1$
2$
3$
4$
un$
dos$
tres$
quatre  $

L'última línia té uns espais després del text quatre.

Mostrar els números de línia:

Amb l'opció -n:

$ cat -n fitxer2
    1	un
    2	dos
    3	tres
    4	quatre  

O el fitxer original és:

$ cat fitxer2
un
dos
tres
quatre  

Podeu utilitzar la opció -b (--number-nonblank) per mostrar només el número de les línies que no estan en blanc:

Eliminar múltiples línies en blank

L'opció -s (--squeeze-blank) comprimeix múltiples línies en blanc seguides en una sola línia.

Mostrar caràcters especials:

Podeu mostrar els tabuladors amb Ho podeu fer amb l'opció -T (--show-tabs)

$ 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

Per mostrar la resta de caràcters especials, utilitzeu -v (--show-nonprinting). Es mostraran amb el caràcter carat (^) i la notació M-.

Combinar fitxers amb cat

$ cat primer.txt segon.txt > combinat.txt

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

És el que fa la comanda cat a soles:

$ cat
1
1
2
2
dos
dos

Podeu cancel·lar amb Ctrl+C.

Utilitzar la entrada estàndard. Caràcter -

El caràcter especial - indica la entrada estàndard.

$ echo "--------" | cat fitxer1 - fitxer2
1
2
3
4
--------
un
dos
tres
quatre  

o

$ cat fitxer1 - fitxer2 < fitxer3
1
2
3
4
1	un
2	dos
3	tres
4	quatre
un
dos
tres
quatre  

Concatena els fitxers en el següent ordre fitxer1, fitxer3 i fitxer2.

tac

És una comanda similar a cat (és cat al revés) però concatena els fitxers en l'ordre contrari a cat

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

cut

Segons el manual:

$ man cut

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

Es pot especificar el que es vol extreure de formes diferents:

  • Per bytes: Amb l'opció -b (--bytes=list) extreu la llista de bytes especificats del fitxer d'entrada.
  • Per caràcters: Amb l'opció -c (--characters=list) extreu la llista de caràcters especificats del fitxer d'entrada. Bytes i caràcters acostumen a ser el mateix a no ser que s'utilitzi una codificació de caràcters multibyte.
  • Per camps: Amb l'opció -f (--fields=list) mostra la llista de camps especificats del fitxer d'entrada. Per defecte el separador de camps és el tabulador però es poden especificar altres separadors de camp amb l'opció -d char o --delim=char o --delimiter=char. Amb aquesta opció per defecte cut no mostra les línies que no contenen el delimitador. Es pot canviar aquest comportament amb l'opció -s o --only-delimited

La majoria d'opcions utilitzen una llista, que és una forma d'especificar múltiples bytes, caràcters o camps.

Exemples de llistes:

  • 2: Especifica el segon camp
  • 2-6: Un rang (de 2 a 6)
  • -4 o 4- o 4+: un rang obert

L'ordre cut s'utilitza sovint en scripts de shell per extreure informació d'altres comandes. Vegeu l'exemple amb ifconfig de més avall.

Exemples:

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

Mostra el tercer i el cinquè camp de totes les línies de /etc/passwd considerant que el separador de camps és : (paràmetre -d). Fixeu-vos que l’especificació del separador difereix respecte sort.

Mostra únicament l’hora actual (estem seleccionant el rang de caràcters entre la columna 12 i la 19).

$ date | cut -c12-19
6:48:25

Per exemple, per tal d'obtenir la MAC:

$ ifconfig eth0 | grep HWaddr | cut -d “ “ -f 11
00:0C:76:96:A3:73

On ifconfig hagués donat com resultat:


$ ifconfig eth0
eth0         Link encap:Ethernet HWaddr 00:0C:45:68:B3:44
             inet addr:192.168.1.4 Bcast:192.168.1.255 Mask:255.255.255.0
             inet6 addr: fe80::20c:76ff:fe96:a373/64 Scope:Link
             UP BROADCAST NOTRAILERS RUNNING MULTICAST MTU:1500 Metric:1
             RX packets:7127424 errors:0 dropped:0 overruns:0 frame:0
             TX packets:5273519 errors:0 dropped:0 overruns:0 carrier:0
             collisions:0 txqueuelen:1000
             RX bytes:6272843708 (5982.2 Mb) TX bytes:1082453585 (1032.3 Mb)
             Interrupt:10 Base address:0xde00

expand

Segons els manual:

$ man expand

Que també podeu consultar online a:

man expand

expand converteix tabuladors en espais.


Consulteu també la comanda contraria unexpand.

fmt

Tal i com diu el manual:

$ man fmt

és una comanda per formatar fitxers.

Sovint ens trobem amb fitxer amb línies molt llargues o paràgrafs mal formatats. Per exemple:

$ cat 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 comunicar e disvetlar vostres virtuosíssims desigs sobre los fets dels antics virtuosos
e en fama molt gloriosos cavallers dels quals los poetes e historials han en ses obres comandat perpetuant llurs recordacions e virtuosos actes. Esingularment los molt insignes actes de cavalleria d'aquell tan famós
cavaller, que, com lo sol resplandeix entre los altres planetes, així resplandeix aquest en singularitat de cavalleria entre els altres cavallers del món, apellat Tirant lo Blanc, qui per sa virtut conquistà molts regnes e
províncies donant-los a altres cavallers, no volent-ne sinó la sola honor de cavalleria. E més avant conquistà tot l'imperi grec, cobrant-lo dels turcs qui aquell havien subjugat a llur domini dels crestians grecs.


E com la dita història e actes del dit Tirant sien en llengua anglesa, e a vostra il.lustre senyoria sia estat grat voler-me pregar la giràs en llengua portuguesa, opinant,  per jo ésser estat algun temps en l'illa d'Anglaterra,
degués millor saber aquella llengua que altri; 

Amb fmt es pot formatar el fitxer:

$ fmt 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 comunicar e disvetlar
vostres virtuosíssims desigs sobre los fets dels antics virtuosos e
en fama molt gloriosos cavallers dels quals los poetes e historials
han en ses obres comandat perpetuant llurs recordacions e virtuosos
actes. Esingularment los molt insignes actes de cavalleria d'aquell tan
famós cavaller, que, com lo sol resplandeix entre los altres planetes,
així resplandeix aquest en singularitat de cavalleria entre els altres
cavallers del món, apellat Tirant lo Blanc, qui per sa virtut conquistà
molts regnes e províncies donant-los a altres cavallers, no volent-ne
sinó la sola honor de cavalleria. E més avant conquistà tot l'imperi
grec, cobrant-lo dels turcs qui aquell havien subjugat a llur domini
dels crestians grecs. 
  

E com la dita història e actes del dit Tirant sien en llengua anglesa,
e a vostra il.lustre senyoria sia estat grat voler-me pregar la giràs en
llengua portuguesa, opinant,  per jo ésser estat algun temps en l'illa
d'Anglaterra, degués millor saber aquella llengua que altri;

Per defecte la mida màxima d'una línia és 75 caràcters. Ho podeu canviar amb

$ 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
comunicar e disvetlar
vostres virtuosíssims
desigs sobre los fets dels
antics virtuosos e en fama
molt gloriosos cavallers
dels quals los poetes e
historials han en ses obres
comandat perpetuant llurs
recordacions e virtuosos
actes. Esingularment los molt
insignes actes de cavalleria
d'aquell tan famós cavaller,
que, com lo sol resplandeix
entre los altres planetes,
així resplandeix aquest en
singularitat de cavalleria
entre els altres cavallers
del món, apellat Tirant lo
Blanc, qui per sa virtut
conquistà molts regnes
e províncies donant-los
a altres cavallers, no
volent-ne sinó la sola honor
de cavalleria. E més avant
conquistà tot l'imperi grec,
cobrant-lo dels turcs qui
aquell havien subjugat a llur
domini dels crestians grecs.  


E com la dita història e
actes del dit Tirant sien
en llengua anglesa, e a
vostra il.lustre senyoria
sia estat grat voler-me
pregar la giràs en llengua
portuguesa, opinant,  per jo
ésser estat algun temps en
l'illa d'Anglaterra, degués
millor saber aquella llengua
que altri; 

o

$ fmt  --width=30 tirant

head

Vegeu també la comanda contraria tail.

Sovint lo únic que es necessita es veure les primeres línies d'un fitxer (per exemple per identificar-lo) o per exemple per saber de quina data són les primeres entrades d'un fitxer de log.

$ sudo head /var/log/syslog
...

Per defecte mostra les primeres 10 línies. 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.

Es poden especificar múltiples fitxers al mateix temps:

$ sudo head /var/log/syslog /var/log/syslog.0

od

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 (basura) si els mostreu amb aquest tipus de comandes. Per exemple:

$ cat /bin/ls 

Us mostrarà una sèrie de caràcters estranys. Si la terminal no es recupera escriviu reset i premeu enter per a recuperar-la. Feu-ho encara que no veieu el que esteu escrivint.

NOTA: Podeu utilitzar la comanda file per saber de quin tipus és un fitxer. També tingueu en compte que la extensió del fitxer només us pot donar una pista del 
tipus de fitxer però no és normatiu. És a dir, us podreu trobar un fitxer: fitxer.txt que sigui un fitxer binari.

Per a veure aquest tipus de fitxers podeu utilitzar la comanda od. El nom són les sigles de octal dump.

$ od /bin/ls 
0000000 042577 043114 000401 000001 000000 000000 000000 000000
0000020 000002 000003 000001 000000 115440 004004 000064 000000
0000040 071570 000001 000000 000000 000064 000040 000011 000050
0000060 000034 000033 000006 000000 000064 000000 100064 004004
0000100 100064 004004 000440 000000 000440 000000 000005 000000
0000120 000004 000000 000003 000000 000524 000000 100524 004004
...

Els resultats es mostren en un format octal (base 8). El primer camp és sempre l'índex i la resta el contingut en aquella posició de l'índex.

Cal tenir en compte que els fitxers de text també es poden mostrar amb od (al cap hi ha la fi, tots els fitxers s'acaben guarden com a grups de bites al disc dur). Fixeuv-os quin és el resultat de mostrar el fitxer:

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

Els números són els equivalents a la taula ascii. Amb la comanda [ascii] ho podeu comprovar (A Red Hat/Fedora la comanda ascii no està instal·lada. La podem instal·lar d'aquí per exemple:paquet ascii rpm)

$ 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 

A més od també pot mostrar els fitxers en altres formats amb la opció -t TYPE (--format=TYPE)

base 16. 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 
...

base 10 (decimal):

$ od -t d numeros
0000000   171051569   171182643   171313717        2615
0000016

ASCII:

Mostra en format ascii però amb caràcters de control d'escapament per tal d'evitar errors a la terminal:

$ od -t a numeros
0000000   1  nl   2  nl   3  nl   4  nl   5  nl   6  nl   7  nl
0000016


Consulteu el manual per veure altres exemples de format. control characters. Consult the man page for od for details on creating these variants.

join

Segons els manual:

$ man join

Que també podeu consultar online a:

man join

combina el contingut de dos fitxers segons un camp (field) coincident als dos fitxers.

Típicament els camps estan separats per espais, però es poden especificar altres caracters com a separadors de línia amb l'opció '-t' char on char és el caràcter que voleu utilitzar com a separador.

Vegem com funciona join a través d'un exemple.Teniu dos fitxers:

$ 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 previàment la comanda sort per tal de cumplir amb aquest requisit.

nl

Segons el manual:

$ man nl

la comanda nl mostra els números de línia d'un fitxer:

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

Cal tenir el compte que també es poden mostrar els números de línia amb la comanda cat:

 $ cat -n /etc/group

o

$ cat -b /etc/group

Però la comanda nl té més opcions:

  • Estil de la numeració: Es pot canviar amb l'opció -b STYLE (--body-numbering=STYLE). Els estils són:
    • a: números a totes les línies
    • t: números a totes les línies no buides (per defecte al cos del fitxer)
    • 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

Hi han opcions equivalents per als peus de pàgina i les capçaleres:

`-f STYLE'
`--footer-numbering=STYLE'
`-h STYLE'
`--header-numbering=STYLE'
    Analogous to `--body-numbering'.
  • Format numèric -n (--number-format=format): les opcions són:
    • ln: justificat a l'esquerre sense zeros inicials
    • rn: justificat a la dreta sense zeros inicials
    • rz: justificat a la dreta amb zeros

paste

Segons el manual:

$ man paste 

que també podeu consultar a internet a:

http://linux.die.net/man/1/paste

la comanda paste fusiona el contingut de dos fitxers en un de sol, línia a línia. Sí ho tornem a aplicar l'exemple que hem utilitzat a join:

$ 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

Un ús força freqüent de la comanda és crear una sortida de dos columnes:

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

On els fitxers originals eren:

$ cat numeros
1
2
3
4
5
6
7

i

$ cat numeros1
un
dos
tres
quatre
cinc
sis
set


l'opció -s (--serial) té el següent resultat:

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

pr

Segons el manual:

$ man pr

la comanda pr prepara fitxers de text per a la seva impressió. El que fa bàsicament és afegir pàgines, capçaleres i peus de pàgina.

$ pr tirant


2009-09-13 19:47                     tirant                     Pàgina 1 
 

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 comunicar e disvetlar vostres  
...

El resultat és un fitxer de línies de mida màxima 80 caràcters i una font monospace i per defecte afegeix una capçalera que inclou el dia i l'hora, el nom del fitxer original i el número de pàgina.

Normalment el resultat s'envia per un conducte (pipe) a la comanda lpr:

$ pr tirant | lpr

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.

Consulteu també la comanda genscript.

sed

És un editor de flux 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). Entre d'altres accions podem:

  • Suprimir una línia determinada d’un fitxer
  • Suprimir un conjunt de línies determinades.
  • Suprimir línies que coincideixin amb un patró determinat.
  • Reemplaçar una cadena de text.
  • Afegir una línia després de cada línia de l’arxiu.
  • ...

La sintaxi de sed és la següent:

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

o

$ 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:

Ordre Adreces Descripció
= 0 o 1 Mostra el número de línia actual
a\text or 1 0 o 1 Afegeix text al fitxer.
i\text 0 o 1 Insereix text al fitxer.
r fitxer1 0 o 1 Afegeix el text del fitxer1 al fitxer
c\text Rang Reemplaça el rang de línies seleccionades pel text proporcionat
s/regexp/text Rang Reemplaça el text que coincideix amb l'expressió regular (regexp)rang de línies seleccionades pel text proporcionat (text)
w fitxer Rang Escriu l'espai del patró actual al fitxers indicat.
q Rang Acaba l'script immediatament, però mostra l'espai del patró actual.
Q Rang Acaba l'script immediatament.

L'ordre sed opera amb el que anomena adreces, que són els números de línia. Tenim les següents opcions:

  • Ordres sense adreça: els canvis s'han d'aplicar a tot el fitxer.
  • Ordres amb una adreça: els canvis s'han d'aplicar a l'adreça (número de línia) indicat.
  • Dos adreces (rang): els canvis s'han d'aplicar a l'interval d'adreces (números de línia) especificats. Els valors extrems del rang estan inclosos.

vegem un exemple d'ús de la comanda sed:

$ sed ‘s/2008/2009/‘ calendari-2008.txt > calendari-2009.txt

el qual reemplaça el text 2008 per 2009 a cada línia (només un cop per línia, és a dir, la primera ocurrència de cada línia). Si volem modificar totes les ocurrències cal utilitzar l'opció g (global):

$ sed ‘s/2008/2009/g‘ calendari-2008.txt > calendari-2009.txt

Per defecte sed envia les modificacions a la sortida estàndard. Per aquesta raó si volem guardar els canvis hem d'utilitzar redireccions

Si no s'especifica fitxer d'entrada, aleshores sed utilitza l'entrada estàndard (per exemple pot ser el resultat d'un altre comanda que em enviat a sed mitjançant una canonada)

Cal tenir en compte que algunes de les ordres que podem utilitzar a des també són vàlides per a vi

Com esborrar una línia d'un fitxer

Si el número de línia és la 10, executaríem:

$ sed -i '10d' file

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

Per esborrar els tres últims caràcters:

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

Per esborrar els 2 primers caràcters:

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

Com convertir un fitxer de DOS a UNIX i viceversa

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ímbol especial.

Per convertir de Unix a DOS:

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

Vegeu també:

Recursos:

Com modificar un fitxer, buscar i reemplaçar text

$ sed -i s/charset=CHARSET/charset=UTF-8/ messages_new.po

Sense l'opció -i es mostraria el fitxer modificat per la sortida estandard. Amb -i es modificar el fitxer.

Atenció: el resultat d'executar l'ordre:
$ sed -i s/charset=CHARSET/charset=UTF-8/ messages_new.po > messages_new.po

És que el fitxer messages_new.po queda buit.

Com eliminar una secció d'un fitxer

Per exemple, per esborrar tot el que estigui entre les línies:

## HERE BEGINS
...
... 
## HERE ENDS
$ sed -i '/## HERE BEGINS/,/## HERE ENDS/d' file

Són expresions regulars, és a dir per exemple podem millorar indicant que la línia ha de començar per

$ sed -i '/^## HERE BEGINS/,/^## HERE ENDS/d' file
Com mostrar una secció d'un fitxer

Utilitzeu l'ordre p

$ sed -n -e '/BEGIN/,/END/p' /my/test/file
Com reemplaçar una secció per un altre

Per exemple, per reemplaçar tot el que estigui entre les línies:

## HERE BEGINS
...
... 
## HERE ENDS

Per el text

prova

Cal fer:

$ sed '/## HERE BEGINS/,/## HERE ENDS/c\prova' file

Si volem reemplaçar per un altre bloc de text, podem fer un script de sed:

$ joe replace

Amb el text

/## HERE BEGINS/,/## HERE ENDS/c\
1: This will replace the entire block\
2: with these two lines of text.\
Una tercera línia

I l'executem amb:

$ sed -f replace file
Afegir un caràcter al final de totes les línies

Per exemple per afegir una a:

$ sudo sed "s/$/a/" /tmp/SEDProva

extra characters after command

No es poden deixar espais extra al final de línia (marcat per \) quan és un fitxer script de sed.

Escapar els caràcters conflictius amb sed (barra "/", contrabarra "\" i punt ".")

Ho podeu fer amb sed mateix:

's/[/\.]/\\&/g'

IMPORTANT: Observeu que utilitzem guions simples!!

De fet estaria sempre bé aplicar aquest sed a qualsevol entrada que us doni l'usuari per tal de no tenir problemes.

Per exemple:

$ PROVA='Prova \ amb/ caràcters . problemàtics'
$ echo $PROVA
Prova \ amb/ caràcters . problemàtics
$ echo $PROVA | sed 's/[/\.]/\\&/g'
Prova \\ amb\/ caràcters \. problemàtics


Exemples de sed per a detectar tipus de línies

Tots aquests exemples es poden provar amb:

$ sed -e '/regexp/d' /path/to/my/test/file | more

En aquest cas eliminareu (ordre d al final) les línies que coincideixin. Si només voleu identificar-les/visualitzar-les utilitzeu l'ordre p:

$ sed -n -e '/regexp/p' /path/to/my/test/file | more

On l'opció n és execució silenciosa.

Línies que contenen almenys un caràcter

/./	Will match any line that contains at least one character

Qualsevol línia que contingui almenys dos caràcters o més

/../	Will match any line that contains at least two characters

Per a més caràcters poseu més punts

Qualsevol línia de comentari

/^#/	Will match any line that begins with a '#'

Qualsevol línia en blanc

/^$/	Will match all blank lines

Qualsevol línia que acabi en un caràcter concret

/}$/	Will match any lines that ends with '}' (no spaces)

Qualsevol línia que acabi en un caràcter concret més zero més espais

/} *$/	Will match any line ending with '}' followed by zero or more spaces

Qualsevol línia que contingui una llista de caràcters

/[abc]/	Will match any line that contains a lowercase 'a', 'b', or 'c'

Modificar fitxers de configuració

Modificar els valors de variables a un fitxer de configuració amb el format VARIABLE=VALOR

Utilitzeu l'ordre c:

$ cat prova
VARIABLE2=anticvalor
VARIABLE3=valor3
$ sed -i "/^VARIABLE2=/c VARIABLE2=nouvalor" prova 
$ cat prova
VARIABLE2=nouvalor
VARIABLE3=valor3

sort

NOTA: vegeu també PHP Sort

IMPORTANT: Tal com diu el manual, els locales afecten a la forma tradicional d'ordenar. Si voleu ordenar per bytes (per exemple per codi ASCCI) heu d'utilitzar LANG=C. Consulteu sort i locales.

Segons el manual:

$ man sort

que també podeu consultar a Internet:

http://linux.die.net/man/1/sort

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

Exemples:

Mostra per stdout el resultat d’ordenar alfabèticament el fitxer /etc/passwd considerant el contingut sencer de la línia.

$ sort /etc/passwd

Mostra el resultat d’ordenar numèricament (paràmetre -n) pel tercer camp (paràmetre -k3), considerant que el caràcter separador de camps és : (paràmetre -t:). Proveu-la també sense el -n.

$ 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 com per exemple:

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

Podem executar:

$ sort -g numeros

o

$ sort -n numeros

sort i locales

Creeu el següent fitxer:

$ joe provasort.txt
abcd
america
ABCD
be
bandera
Bandera
1 
2  
3  
10
11

Si el vostre locale és:

$ locale
LANG=ca_ES.UTF-8
...

Aleshores el resultat de:

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

És a dir s'ordena segons s'ordena en català.

Si voleu la típica ordenació per taula ascii:

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

A la taula Ascii les majúscules van abans que les mínuscules (observeu que els números no es veuen afectats per que estem ordenant per caràcters no per numèrics).

split

Segons el manual:

$ man split

la comanda split pot dividir un fitxers en múltiples subfitxers. La divisió del fitxer es pot fer per mida o per nombre de línies:

  • -b size (--bytes=size): parteix el fitxer en fitxers més petits de mida màxima la especificada amb l'opció -b. La mida s'especifica.
    • -C=size or --line-bytes=size: parteix el fitxer en fitxers més petits de mida màxima la especificada amb l'opció -C però sense trencar salts de línia (excepte que la línia sigui més llarga que la mida especificada)
  • -l LINES (--lines=LINES): parteix el fitxer en fitxers més petits on cada subfitxer té com a màxim les línies especificades.

A diferència d'altres comandes de manipulació de fitxer, cal especificar el prefix dels subfitxers de sortida. Tots els fitxers tindran com a nom el prèfix més un lletra de l'alfabet (ordenades alfabèticament). Si no s'especifica el prefix és x.

Exemples:

Si tenim un fitxer amb els 20 primers números:

$ split -l 5 numeros20 numeros
$ ls -la numeros*
-rw-r--r-- 1 sergi sergi   51 2009-09-13 18:35 numeros20
-rw-r--r-- 1 sergi sergi   10 2009-09-13 18:36 numerosaa
-rw-r--r-- 1 sergi sergi   11 2009-09-13 18:36 numerosab
-rw-r--r-- 1 sergi sergi   15 2009-09-13 18:36 numerosac
-rw-r--r-- 1 sergi sergi   15 2009-09-13 18:36 numerosad

On a numerosaa conté els 5 primers números, numerosab conté els 5 següents números, i així successivament.

La opció -C pot ser útil per a partir grans fitxers de text com fitxers de log:

$ split -C 10K /var/log/apache2/acces.log apache_access

Per exemple, partir un fitxer en múltiples sub fitxers de mida més petita:

$ cat  FitxerGran | split -b 100M - FitxerGranEnTrossets 

El fitxer es pot recuperar amb la comanda cat:

$ cat FitxerGranEnTrossets* > FitxerGran

Recursos:

Empaquetar un fitxer en múltiples fitxers partits

Vegeu tar#Empaquetar un fitxer en múltiples fitxers partits

tail

Segons el manual

$ man tail

La comanda tail és molt similar a la comanda head però mostra el final del fitxer en comptes del principi. Per defecte mostra les últimes 10 línies. Es poden utilitzar les mateixes opcions que a la comanda head:


La comanda és molt utilitzada per tal de veure l'activitat més recent dels fitxers de log:

$ tail /var/log/syslog

La opció -f (following) permet mostrar les actualitzacions de les últimes línies de forma constant:

$ tail -f /var/log/syslog

La opció

--pid=pid 

Indica que el tail s'aturi (quan s'utilitza conjuntament amb -f) quan el proces amb el PID especificat finalitzi.

tr

Tal com indica el manual:

$ man tr

la comanda tr modifica o elimina caràcters de la entrada estàndard. La sintaxi és la següent:

$ tr [options] 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.

Per exemple podem passar de minúscules a majúscules les inicials del fitxer:

$ cat noms 
Linux Torvalds
Richard Stallman
Ian Murdock

Amb:

$ tr LTRSIM ltrsim < noms 
linux torvalds
richard stallman
ian murdock

Si SET2 és menor que SET1 aleshores, tots els caracters de SET1 que no tenen equivalent a SET2 es reemplacen per l'últim caràcter de SET2:

$ tr LTRSIM ltrsi < noms 
linux torvalds
richard stallman
ian iurdock
$ tr LTRSIM ltrs < noms 
linux torvalds
richard stallman
san surdock

També es pot utilitzar per eliminar caràcters. Per exemple, per eliminar les a:

$ tr -d a < noms 
Linux Torvlds
Richrd Stllmn
In Murdock

Per guardar el resultat en un fitxer podeu utilitzar:

$ tr -d a < noms > noms_sense_a

També hi ha una sèrie de dreceres:

  • [:alnum:]: tots els números i lletres
  • [:upper:]: totes les lletres majúscules
  • [:lower:]: totes les lletres minúscules
  • [:digit:]: tots els números
  • [A-M]: Tots els caràcters de la A a la M.

Passar de majúscules a minúscules i viceversa

Per passar amb minúscules el millor seria:

$ tr [:upper:] [:lower:] < noms > noms_minuscules

Eliminar múltiples espais en blanc (squeeze-repeats)

$ cat fitxer | tr -s ' ' 
$ man tr | grep squeeze
      Translate, squeeze, and/or delete characters from standard input, writing to standard output.
      -s, --squeeze-repeats

Eliminar un caràcter d'un fitxer

Per exemple, si volem eliminar les cometes d'un fitxer:


$ tr -d \"  < fitxer_amb_cometes.txt

Observeu com a calgut escapar les cometes (\) ja que són un caràcter especial.

El fitxer origen és:

1,"2TESA","02","CA","29",2,5,,
1,"2TESA","02","CA",,4,1,,
2,"2ECOHU","02","CA","25",1,3,,
2,"2ECOHU","02","CA","25",2,3,,
6,"3ESC","01","CA","E17",1,8,,
6,"3ESC","01","CA","E17",3,4,,
6,"3ESC","01","CA","E17",5,5,,
8,"3ESA","01","CA","26",5,1,,
8,"3ESA","01","CA","26",5,2,,
9,"3ESB","01","CA","27",1,7,,


i queda de la següent manera:

1,2TESA,02,CA,29,2,5,,
1,2TESA,02,CA,,4,1,,
2,2ECOHU,02,CA,25,1,3,,
2,2ECOHU,02,CA,25,2,3,,
6,3ESC,01,CA,E17,1,8,,
6,3ESC,01,CA,E17,3,4,,
6,3ESC,01,CA,E17,5,5,,
8,3ESA,01,CA,26,5,1,,
8,3ESA,01,CA,26,5,2,,
9,3ESB,01,CA,27,1,7,,

Passar un fitxer CSV a tabuladors

$ tr , \\t < fitxerCSV.txt > fitxerTabuladors.txt

Per exemple converteix el següent fitxer:

1,"2TESA","02","CA","29",2,5,,
1,"2TESA","02","CA",,4,1,,
2,"2ECOHU","02","CA","25",1,3,,
2,"2ECOHU","02","CA","25",2,3,,
6,"3ESC","01","CA","E17",1,8,,
6,"3ESC","01","CA","E17",3,4,,
6,"3ESC","01","CA","E17",5,5,,
8,"3ESA","01","CA","26",5,1,,
8,"3ESA","01","CA","26",5,2,,
9,"3ESB","01","CA","27",1,7,,

En:

1	"2TESA"	"02"	"CA"	"29"	2	5		
1	"2TESA"	"02"	"CA"		4	1		
2	"2ECOHU"	"02"	"CA"	"25"	1	3		
2	"2ECOHU"	"02"	"CA"	"25"	2	3		
6	"3ESC"	"01"	"CA"	"E17"	1	8		
6	"3ESC"	"01"	"CA"	"E17"	3	4		
6	"3ESC"	"01"	"CA"	"E17"	5	5		
8	"3ESA"	"01"	"CA"	"26"	5	1		
8	"3ESA"	"01"	"CA"	"26"	5	2		
9	"3ESB"	"01"	"CA"	"27"	1	7

unexpand

Segons el manual:

$ man unexpand

      unexpand - convert spaces to tabs

Un exemple:

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

Consulteu expand. unexpand és l'ordre contraria.

uniq

Segons el manual:

$ man uniq

la comanda uniq elimina les línies duplicades. Per exemple el següent fitxer:

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

Si apliquem uniq:

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

Vegem que queda igual.

NOTA: Cal tenir en compte que només ho fa amb línies successives!. Cal aplicar primer sort:

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

Un exemple una mica més elaborat. Consulta el logs d'Squid i mostrar les diferents IPs que utilitzen el servei:

$ cat /var/log/squid/access.log | awk '{print $3}' | uniq | sort -u | more

Recursos:

xargs

Consulteu xargs.

wc

wc són les inicials de word count. wc compte les paraules, així com també pot comptar línies, caràcters i bytes. Per exemple:

$ wc fitxer.txt
 200 2100 14965 fitxer.txt

La sortida ens indica que el fitxer té:

  • 200 línies (concretament es compten la quantitat de caràcters de nova línia)
  • 2100 paraules
  • 14965 bytes

Es pot limitar la informació de la sortida amb:

  • -l (--lines): mostra el número de línies.
  • -w (--words): mostra el número de paraules.
  • -c (--bytes): Mostra el número de bytes. Compte no confondre amb caràcters.
  • -m (--chars): Mostra només els caràcters. Normalment (en ASCII cada caràcter ocupa un byte), coincideix el nombre de caràcters amb el nombre de bytes.

També es pot utilitzar per saber quina és la longitud de la línia més llarga amb:

$ wc -L /etc/profile
70 /etc/profile

Comandes agrupades per funcionalitat

Comandes de combinació de fitxers: cat, join, paste

Comandes de transformació de fitxers: expand, od, sort, split, tr, unexpand i uniq

Comandes per formatar fitxers: fmt, nl i pr

Comandes per visualitzar fitxers: head, tail, less i more

Comandes per obtenir informació dels continguts d'un fitxer

Altres

awk

Vegeu awk.

Scripts de xarxa

Consulteu l'article Scripts de xarxa.

Exemples ALUMNES

Imagineu un fitxer ALUMNES:

maria:perez:sistemes operatius:07
pepe:perez:sistemes operatius:06
pepa:perez:sistemes operatius:08
joan:puig:sistemes operatius:09
josep:vidal:sistemes operatius:03
maria:fernandez:sistemes operatius:02
maria:tur:sistemes operatius:01
sergi:perez:sistemes operatius:04
sergi:tur:sistemes operatius:05
bego:sole:sistemes operatius:06
sristina:sole:sistemes operatius:07
josep:puigcercos:sistemes operatius:02
maria:perez:enginyeria programari:07
pepe:perez:enginyeria programari:06
pepa:perez:enginyeria programari:05
joan:puig:enginyeria programari:09
josep:vidal:enginyeria programari:05
maria:fernandez:enginyeria programari:02
maria:tur:enginyeria programari:03
sergi:perez:enginyeria programari:05
sergi:tur:enginyeria programari:06
bego:sole:enginyeria programari:05
sristina:sole:enginyeria programari:07
josep:puigcercos:enginyeria programari:08
filipa:mccain:enginyeria programari:04
pepa:josep:estructura informació:08
maria:perez:estructura informació:07 
pepe:perez:estructura informació:06
pepa:perez:estructura informació:05
joan:puig:estructura informació:09
josep:vidal:estructura informació:05
maria:fernandez:estructura informació:01
maria:tur:estructura informació:03
sergi:perez:estructura informació:06
sergi:tur:estructura informació:06
bego:sole:estructura informació:05
sristina:sole:estructura informació:05
josep:puigcercos:estructura informació:08
felip:pret:estructura informació:05
josep:puixet:estructura informació:09

Per calcular la mitjana podem utilitzar:

$ awk -F":" '{sum+=$4} END { print "Mitjana del fitxer " FILENAME " = ",sum/NR}' ALUMNES
Mitjana del fitxer ALUMNES =  5.5

Obtenir els aprovats:

$ awk -F":" '$4 > 4 { print $0}' ALUMNES

Obtenir els suspesos:

$ awk -F":" '$4 < 5 { print $0}' ALUMNES

Comptar els aprovats:

$ awk -F":" '$4 > 4 { print $0}' ALUMNES | wc -l

Comptar els suspesos:

 $ awk -F":" '$4 < 5 { print $0}' ALUMNES | wc -l

Script:

$ joe script.sh
#!/bin/bash

#Obtenir el fitxer APTES ordenats per assignatura
awk -F":" '$4 > 4 { print $0}' ALUMNES | sort -t: -k3 > APTES  

#Obtenir el fitxer NO_APTES ordenats per assignatura
awk -F":" '$4 < 5 { print $0}' ALUMNES | sort -t: -k3 > NO_APTES

#Mostrar la nota mitjana de cada assignatura
#awk -F":" '{print $3}' ALUMNES | uniq

awk -F":" '{print $3}' ALUMNES | uniq | while read ASSIGNATURA
do
        echo $ASSIGNATURA
        grep "$ASSIGNATURA" ALUMNES | awk -F":" '{sum+=$4} END { print "Mitjana del crèdit = ",sum/NR}'
done
$ ./script.sh
sistemes operatius
Mitjana del crèdit =  5.08333
enginyeria programari
Mitjana del crèdit =  5.53846
estructura informació
Mitjana del crèdit =  5.86667

grep

Consulteu l'article grep.