A la lliçó anterior vas aprendre a moure fitxers de lloc; ara aprendràs a llegir què hi ha a dins i a fer-los preguntes. Aquesta és, de bon tros, la lliçó més rendible del mòdul: els 40 minuts diaris que l'equip de Veloz Envíos perd elaborant l'informe manual se'n van gairebé sencers a obrir app.log a mà, comptar errors amb el dit i buscar ciutats a enviaments.csv amb el cercador de l'editor. En acabar aquesta lliçó faràs cadascuna d'aquestes coses en un segon, i amb les eines que hi veuràs ja podràs respondre preguntes reals sobre l'estat del servidor.
Contingut
- El paradigma Unix: text pla en fluxos de línies
- Veure fitxers sencers:
cat,tac,nl - Veure fitxers grans:
less,head,tailitail -f - Comptar amb
wc - Buscar amb
grep - Extreure columnes amb
cut - Ordenar i comptar:
sortiuniq - Transformar amb
tri presentar ambcolumn
- El paradigma Unix: text pla en fluxos de línies
Abans de cap ordre, entén la idea que fa que tot això encaixi. A Unix, gairebé tot es representa com a text pla organitzat en línies: la configuració del sistema, els registres de l'aplicació, la sortida de les ordres i les dades de negoci. I hi ha un conjunt de programes petits, cadascun expert en una transformació de línies, dissenyats per combinar-se entre ells.
Les tres conseqüències pràctiques:
- Una línia és un registre. Comptar línies és comptar successos; filtrar línies és filtrar successos.
- Els programes no saben de formats.
grepno sap què és un log nicutquè és un CSV. Treballen sobre línies i columnes, i això els fa universals. - La sortida d'un és l'entrada d'un altre. És el principi de les canonades, que formalitzarem a 02-04. Aquí farem servir
|de manera puntual, i n'hi ha prou de llegir-lo com «passa el resultat a l'ordre següent».
Treballarem sobre els tres fitxers de Veloz Envíos: app.log (DATA HORA [NIVELL] missatge, un esdeveniment per línia), acces.log (format combinat, una petició HTTP per línia) i enviaments.csv (un enviament per línia, amb capçalera i separador ,).
- Veure fitxers sencers:
cat, tac, nl
cat, tac, nlcat (concatenate) aboca el contingut d'un o més fitxers a la pantalla:
id_enviament,data,ciutat,repartidor,estat,import E-10234,2026-08-03,Valencia,alopez,lliurat,14.50 E-10235,2026-08-03,Sevilla,mgarcia,incidencia,22.00 E-10236,2026-08-03,Bilbao,jruiz,en_repartiment,9.75
El seu nom ve de la seva segona funció: concatenar diversos fitxers en un sol flux, útil per processar tot l'històric de cop amb cat /srv/veloz/dades/historic/2026/08/*.csv (els comodins es veuen a 02-05). Opcions que val la pena recordar: -n numera totes les línies, -b numera només les que no són buides i -A mostra els caràcters invisibles (tabuladors com ^I, final de línia com $), imprescindible quan un fitxer «sembla correcte» però un programa el rebutja.
Dos parents propers: tac imprimeix les línies en ordre invers (molt pràctic en registres, on el que és recent queda al final; tac app.log | head -5 dóna els 5 esdeveniments més recents començant per l'últim) i nl, que numera amb format configurable.
Advertiment important: no facis mai cat d'un fitxer gran. Un app.log de 200 MB inundarà el teu terminal durant minuts. Per a això hi ha less, head i tail.
- Veure fitxers grans:
less, head i tail
less, head i tailless obre el fitxer en un visor paginat sense carregar-lo sencer a memòria; és l'eina per defecte per inspeccionar qualsevol cosa.
| Tecla | Acció |
|---|---|
Espai / b |
Pàgina endavant / enrere |
g / G |
Anar al principi / al final del fitxer |
/text / ?text |
Buscar endavant / enrere; n següent, N anterior |
-N |
Mostrar o amagar els números de línia |
F |
Seguir el fitxer en directe (com tail -f); Ctrl-C per sortir del mode |
q |
Sortir |
Reconeixeràs aquestes tecles: són les mateixes de man, perquè man fa servir less com a paginador (lliçó 01-05).
head mostra el principi i tail el final. Tots dos fan servir 10 línies per defecte i accepten -n NOMBRE:
head -n 3 /srv/veloz/dades/enviaments.csv # capçalera + 2 registres
tail -n 20 /var/log/veloz/app.log # els 20 últims esdeveniments
tail -n +2 /srv/veloz/dades/enviaments.csv # DES DE la línia 2: el CSV sense capçaleraAquesta tercera forma, tail -n +2, és un truc que faràs servir constantment: descarta la capçalera del CSV perquè les ordres següents només vegin dades.
tail -f: veure el registre en directe
L'opció estrella per a operacions. -f (follow) deixa l'ordre oberta imprimint cada línia nova a mesura que s'escriu:
2026-08-03 11:04:15 [WARN] latencia elevada en consulta de repartidores (812ms) 2026-08-03 11:04:19 [ERROR] timeout al conectar con pasarela de pago
Se'n surt amb Ctrl-C. Aquesta és l'ordre que tindràs oberta en una finestra mentre desplegues un canvi a veloz-api. Una variant millor per a registres que roten és tail -F: si el fitxer es reanomena i se'n crea un de nou (rotació diària), -F segueix el nom i continua mostrant el registre actual, mentre que -f es queda enganxat al fitxer antic.
- Comptar amb
wc
wcwc (word count) compta línies, paraules i bytes: aquests són els tres números. -l (línies) és el que faràs servir el 95 % de les vegades: compta esdeveniments, peticions o registres. També existeixen -w (paraules), -c (bytes) i -m (caràcters, que difereix de -c amb accents en UTF-8).
Amb wc -l < /srv/veloz/dades/enviaments.csv obtens 1247 a seques. Aquest < és una redirecció d'entrada (02-04) i fa que wc no imprimeixi el nom del fitxer, només el número. Recorda restar 1 per la capçalera: hi ha 1246 enviaments.
- Buscar amb
grep
grepgrep filtra les línies que contenen un patró. És l'eina més utilitzada de tot Unix.
Això imprimeix, una per línia, cada esdeveniment del registre el text del qual contingui ERROR. Les opcions que necessites de debò:
| Opció | Efecte | Exemple real |
|---|---|---|
-i |
Ignora majúscules/minúscules | grep -i valencia enviaments.csv |
-n |
Mostra el número de línia | Localitzar l'esdeveniment al fitxer |
-c |
Només compta les línies que casen | grep -c ERROR app.log |
-v |
Inverteix: mostra les que NO casen | Excloure el soroll d'[INFO] |
-w |
Paraula completa | grep -w jruiz no casa amb jruizb |
-r / -l |
Recursiu per un directori / només els noms de fitxer que casen | grep -rl ERROR /var/log/veloz/ |
-A n / -B n / -C n |
n línies després / abans / de context a banda i banda | Veure què envoltava l'error |
-F |
Patró literal, sense caràcters especials | Buscar GET /api/envios?id=1.2 |
-o |
Imprimeix només la part que casa, no la línia sencera | Extreure valors |
grep -c ERROR /var/log/veloz/app.log retorna 37: trenta-set errors avui, una dada que abans s'obtenia comptant a ull.
2158-2026-08-03 09:12:42 [INFO] iniciando cobro del envio E-10188 2159-2026-08-03 09:12:43 [WARN] reintento 1 de 3 hacia la pasarela 2160:2026-08-03 09:12:44 [ERROR] timeout al conectar con pasarela de pago 2161-2026-08-03 09:12:45 [INFO] cobro marcado como pendiente
El context és el que converteix un error solt en un diagnòstic: la línia amb : és la que ha casat, les de - són el context, i juntes expliquen la història completa.
grep -v "\[INFO\]" /var/log/veloz/app.log | tail -5 # només allò que no és rutina
grep -F "GET /api/envios?ciudad=Valencia" acces.log | wc -l # peticions a aquesta rutaSobre els patrons: grep interpreta el patró com una expressió regular, un llenguatge de coincidències amb caràcters especials (., *, [, ^, $...). Per això a dalt cal escapar els claudàtors d'[INFO], i per això -F —que desactiva tota interpretació— és tan útil quan busques una cadena literal amb punts, barres o interrogants. Les expressions regulars completes són un tema en si mateix i les estudiarem a fons a 05-04; amb les opcions d'aquesta taula i patrons literals cobreixes el 80 % de la feina diària.
- Extreure columnes amb
cut
cutcut retalla cada línia i retorna només els camps que demanes. Per a un CSV, -d defineix el delimitador i -f els camps (començant per 1).
Recordem la capçalera d'enviaments.csv: id_enviament,data,ciutat,repartidor,estat,import → camps 1 a 6.
Observa que la primera línia de la sortida és ciutat: la capçalera del CSV també es processa com un registre més.
cut -d, -f3,5 /srv/veloz/dades/enviaments.csv # camps 3 i 5 (ciutat i estat)
cut -d, -f4-6 /srv/veloz/dades/enviaments.csv # rang del 4 al 6
cut -c1-10 /var/log/veloz/app.log # per posició: la data del registreAquest últim ús, -c, talla per posició de caràcter en lloc de per camp, i és molt pràctic en registres de format fix com app.log, on els 10 primers caràcters són sempre la data.
La seva gran limitació: cut no entén les cometes. Si un camp d'un CSV contingués una coma entre cometes ("Valencia, centro"), el recompte de camps es descompensaria. Per a CSV complexos caldran awk (06-01) o eines específiques; per al format controlat de Veloz Envíos, cut és perfecte.
- Ordenar i comptar:
sort i uniq
sort i uniqsort ordena línies alfabèticament per defecte:
| Opció | Efecte |
|---|---|
-n |
Ordre numèric (sense això, 10 va abans que 9) |
-r |
Ordre invers |
-u |
Elimina duplicats després d'ordenar |
-t C |
Defineix el separador de camps |
-k N |
Ordena pel camp N (-k3 pel tercer; -k6 -n per import) |
Extreure la columna, treure la capçalera i ordenar eliminant repetits: aquí tens la llista de ciutats operatives.
uniq col·lapsa línies adjacents iguals, i -c anteposa quantes n'hi havia. Aquesta paraula, adjacents, és la clau: uniq gairebé sempre va precedit de sort, perquè si els duplicats no estan junts no els detecta. La combinació sort | uniq -c | sort -rn és probablement la més útil de tot Unix:
Llegeix-ho d'esquerra a dreta: extreu la ciutat → treu la capçalera → ordena per agrupar → compta cada grup → ordena per número descendent. Acabes de construir un rànquing en una sola línia. Amb sort -t, -k6 -rn sobre el fitxer complet obtindries, en canvi, els enviaments de més import.
- Transformar amb
tr i presentar amb column
tr i presentar amb columntr (translate) substitueix o elimina caràcters, un a un. No treballa amb fitxers com a argument: sempre llegeix de l'entrada.
| Ús | Ordre | Per a què |
|---|---|---|
| Canviar majúscules | tr 'a-z' 'A-Z' |
Normalitzar abans de comparar |
| Substituir el separador | tr ',' '\t' |
Convertir CSV en TSV |
| Esborrar caràcters | tr -d '\r' |
Netejar finals de línia de Windows |
| Comprimir repeticions | tr -s ' ' |
Col·lapsar espais múltiples en un |
El tr -d '\r' mereix atenció: quan un CSV s'ha editat a Windows, cada línia acaba en \r\n, i aquest \r invisible fa que comparacions aparentment idèntiques fallin. Si un filtre no troba res que «hi hauria de ser», comprova el fitxer amb cat -A.
column -t alinea la sortida en columnes perquè un humà la pugui llegir:
id_enviament data ciutat repartidor estat import E-10234 2026-08-03 Valencia alopez lliurat 14.50 E-10235 2026-08-03 Sevilla mgarcia incidencia 22.00 E-10236 2026-08-03 Bilbao jruiz en_repartiment 9.75
-s, indica que el separador d'entrada és la coma i -t genera la taula. És el toc final de qualsevol informe que hagi de llegir una persona.
Amb aquestes vuit eines ja resols la majoria de preguntes. Quan necessitis calcular sobre les columnes (sumar imports, mitjanes, condicions per camp) o reescriure el text amb regles, el següent esglaó són awk i sed, dos llenguatges complets que ocupen el Mòdul 6.
Errors Habituals i Consells
- Fer
catd'un registre enorme. Fes servirless,headotail. Si ja l'has llançat,Ctrl-C. - Fer servir
uniqsensesortal davant. Només col·lapsa línies adjacents; sense ordenar abans, els recomptes surten malament i sense cap error que t'avisi. - Ordenar números amb
sorta seques. L'ordre alfabètic col·loca100abans que9. Per a imports o comptadors,-nsempre. - Oblidar la capçalera del CSV. Apareixerà com una ciutat més anomenada
ciutat;tail -n +2l'elimina. - Barallar-se amb les expressions regulars sense voler. Si el teu patró conté
.,[,?o/, fes servirgrep -F. I atail, recorda que en registres que roten a mitjanit l'opció correcta és-F, no-f. - Comptar amb
grep -ccreient que compta coincidències. Compta línies que casen: dues aparicions a la mateixa línia sumen una. Per comptar aparicions,grep -o patro fitxer | wc -l.
Exercicis
Exercici 1 — Diagnòstic ràpid del dia. Sobre /var/log/veloz/app.log: (1) compta quants esdeveniments hi ha en total; (2) quants són de nivell ERROR; (3) mostra els 5 esdeveniments més recents que no siguin [INFO]; (4) mostra el primer ERROR del fitxer amb les 2 línies anteriors i les 2 posteriors.
Exercici 2 — Rànquing d'incidències per ciutat. Sobre /srv/veloz/dades/enviaments.csv, construeix una única línia que mostri quantes incidències hi ha per ciutat, ordenades de més a menys. Explica cada pas.
Exercici 3 — Informe llegible de repartidors. Obtén la llista de repartidors diferents que apareixen al CSV i, per separat, el nombre d'enviaments de cadascun presentat en forma de taula alineada.
Solucions
Solució a l'Exercici 1
wc -l < /var/log/veloz/app.log # 1
grep -c ERROR /var/log/veloz/app.log # 2
grep -v "\[INFO\]" /var/log/veloz/app.log | tail -5 # 3
grep -n -C 2 ERROR /var/log/veloz/app.log | head -5 # 4A (3), grep -v descarta la rutina i tail -5 es queda amb el més recent, perquè els registres creixen pel final. A (4), -C 2 afegeix dues línies de context a cada banda i head -5 retalla al primer bloc (2 abans + la coincidència + 2 després). El -n numera les línies per poder localitzar-les després amb less -N.
Solució a l'Exercici 2
Pas a pas: grep incidencia es queda només amb les línies l'estat de les quals és incidència (i de passada elimina la capçalera, que no conté aquesta paraula); cut -d, -f3 extreu la ciutat; sort agrupa les repetides; uniq -c compta cada grup; sort -rn ordena pel número descendent. Un filtre més estricte seria grep ',incidencia,' per assegurar que la paraula és al camp d'estat i no dins d'un altre camp.
Solució a l'Exercici 3
# Repartidors diferents → alopez, jruiz, mgarcia
cut -d, -f4 /srv/veloz/dades/enviaments.csv | tail -n +2 | sort -u
# Enviaments per repartidor, en taula alineada
cut -d, -f4 /srv/veloz/dades/enviaments.csv | tail -n +2 | sort | uniq -c | sort -rn | column -tAquí column -t va sense -s, perquè la sortida d'uniq -c està separada per espais, no per comes: -t detecta espais per defecte. És un bon recordatori que cada ordre de la cadena canvia el format, i cal ajustar la següent en conseqüència.
Conclusió
Acabes d'adquirir el nucli del processament de text a Unix: saps veure fitxers amb cat, less, head i tail, vigilar un registre en directe amb tail -f, comptar amb wc -l, filtrar amb grep i les seves opcions de context i inversió, extreure columnes amb cut, ordenar i agregar amb sort i uniq -c, normalitzar amb tr i presentar amb column -t. Sobretot, has vist la lògica que els uneix: cada programa fa una transformació de línies i encadenar-los respon preguntes que cap ordre no resol tota sola.
Fixa't en tot el que ja has guanyat: el rànquing d'incidències per ciutat, que abans exigia obrir el CSV i comptar a mà, ara és una línia que triga mil·lisegons.
Abans d'encadenar filtres amb desimboltura cal resoldre una qüestió prèvia, i és de qui és cada fitxer i qui el pot llegir o escriure. A la lliçó 02-03 estudiaràs els permisos i la propietat: per què veloz-api pot escriure a /var/log/veloz i el teu usuari no, com fer executable el primer script de ~/veloz-ops/bin i com protegir amb permís 600 el fitxer de configuració que aviat contindrà credencials.
Curs de Programació en Bash
Mòdul 1: Introducció a Bash
- Què és Bash?
- Configurar el teu Entorn
- Navegació Bàsica per la Línia d'Ordres
- Entendre el Shell
- Trobar Ajuda: man, help i --help
Mòdul 2: Ordres Bàsiques de Bash
- Operacions amb Fitxers i Directoris
- Ordres de Processament de Text
- Permisos i Propietat dels Fitxers
- Redirecció i Canonades
- Comodins i Expansió de Rutes
- Historial i Dreceres de Teclat
Mòdul 3: Fonaments de Scripting
- Crear i Executar un Script
- Variables i Constants
- Operadors Bàsics
- Sentències Condicionals
- Arguments i Entrada de l'Usuari
- Cometes, Expansió i Substitució
Mòdul 4: Scripting Intermedi
- Bucles en Bash
- Funcions en Bash
- Arrays i Arrays Associatius
- Manipulació de Cadenes
- La Sentència case i els Menús Interactius
- Aritmètica i Càlculs Numèrics
Mòdul 5: Tècniques Avançades de Scripting
- Operacions Avançades amb Fitxers
- Gestió de Processos
- Gestió d'Errors i Depuració
- Expressions Regulars
- Entrada/Sortida Avançada: Descriptors i Here-Documents
- Scripts Modulars i Llibreries Reutilitzables
Mòdul 6: Treballar amb Eines Externes
Mòdul 7: Automatització i Programació
- Tasques Cron
- Automatitzar Tasques
- Scripts de Còpia i Restauració
- Monitoratge i Registre
- Serveis i Temporitzadors amb systemd
- Automatització Remota amb SSH
Mòdul 8: Bones Pràctiques i Optimització
- Escriure Codi Llegible
- Optimitzar Scripts en Bash
- Consideracions de Seguretat
- Control de Versions amb Git
- Anàlisi Estàtica amb ShellCheck i shfmt
- Proves Automatitzades amb Bats
- Portabilitat: POSIX sh enfront de Bashismes
