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 |
103.2. Processar fluxos de text utilitzant filtres | |
---|---|
![]() |
|
![]() |
Àrees Clau de Coneixement: |
![]() |
La següent és una llista parcial de fitxers, termes i utilitats utilitzades: |
![]() |
Apunts: LPI 103.2. Processar fluxos de text utilitzant filtres |
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.
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:
Totes les aplicacions de GNU accepten (ho haurien d'acceptar) les següents opcions:
$ 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.
$ rmdir --ignore-fail-on-non-empty
que
$ rmdir --ignore-fail
o inclus:
$ rmdir --i
$ sort -- -r
Ordena un fitxer anomenat -r.
Altres conceptes comuns:
Recursos:
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-.
$ cat primer.txt segon.txt > combinat.txt
És el que fa la comanda cat a soles:
$ cat 1 1 2 2 dos dos
Podeu cancel·lar amb Ctrl+C.
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.
É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
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:
La majoria d'opcions utilitzen una llista, que és una forma d'especificar múltiples bytes, caràcters o camps.
Exemples de llistes:
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
Segons els manual:
$ man expand
Que també podeu consultar online a:
man expand
expand converteix tabuladors en espais.
Consulteu també la comanda contraria unexpand.
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
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:
Es poden especificar múltiples fitxers al mateix temps:
$ sudo head /var/log/syslog /var/log/syslog.0
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.
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):
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.
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:
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'.
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
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:
Consulteu també la comanda genscript.
É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:
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:
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
Si el número de línia és la 10, executaríem:
$ sed -i '10d' file
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
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:
$ 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.
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
Utilitzeu l'ordre p
$ sed -n -e '/BEGIN/,/END/p' /my/test/file
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
Per exemple per afegir una a:
$ sudo sed "s/$/a/" /tmp/SEDProva
No es poden deixar espais extra al final de línia (marcat per \) quan és un fitxer script de sed.
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
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.
/./ Will match any line that contains at least one character
/../ Will match any line that contains at least two characters
Per a més caràcters poseu més punts
/^#/ Will match any line that begins with a '#'
/^$/ Will match all blank lines
/}$/ Will match any lines that ends with '}' (no spaces)
/} *$/ Will match any line ending with '}' followed by zero or more spaces
/[abc]/ Will match any line that contains a lowercase 'a', 'b', or 'c'
Utilitzeu l'ordre c:
$ cat prova VARIABLE2=anticvalor VARIABLE3=valor3 $ sed -i "/^VARIABLE2=/c VARIABLE2=nouvalor" prova $ cat prova VARIABLE2=nouvalor VARIABLE3=valor3
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
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).
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:
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:
Vegeu tar#Empaquetar un fitxer en múltiples fitxers partits
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.
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
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:
Per passar amb minúscules el millor seria:
$ tr [:upper:] [:lower:] < noms > noms_minuscules
$ cat fitxer | tr -s ' '
$ man tr | grep squeeze Translate, squeeze, and/or delete characters from standard input, writing to standard output. -s, --squeeze-repeats
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,,
$ 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
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.
Segons el manual:
$ man uniq
la comanda uniq elimina les línies duplicades. Per exemple el següent fitxer:
[email protected]:~/Escriptori$ cat shakespeare To be or not to be that is the question
Si apliquem uniq:
[email protected]:~/Escriptori$ 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:
[email protected]:~/Escriptori$ shakespeare | 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:
Consulteu xargs.
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é:
Es pot limitar la informació de la sortida amb:
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
[email protected]:~/Escriptori$ wc shakespeare 10 10 48 shakespeare [email protected]:~/Escriptori$ wc -L shakespeare 8 shakespeare [email protected]:~/Escriptori$ wc -w shakespeare 10 shakespeare [email protected]:~/Escriptori$ wc -c shakespeare 48 shakespeare [email protected]:~/Escriptori$ wc -m shakespeare 48 shakespeare
Vegeu awk.
Consulteu l'article Scripts de xarxa.
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
Consulteu l'article grep.