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

  1. El paradigma Unix: text pla en fluxos de línies
  2. Veure fitxers sencers: cat, tac, nl
  3. Veure fitxers grans: less, head, tail i tail -f
  4. Comptar amb wc
  5. Buscar amb grep
  6. Extreure columnes amb cut
  7. Ordenar i comptar: sort i uniq
  8. Transformar amb tr i presentar amb column

  1. 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. grep no sap què és un log ni cut què é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 ,).

  1. Veure fitxers sencers: cat, tac, nl

cat (concatenate) aboca el contingut d'un o més fitxers a la pantalla:

cat /srv/veloz/dades/enviaments.csv
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.

  1. Veure fitxers grans: less, head i tail

less obre el fitxer en un visor paginat sense carregar-lo sencer a memòria; és l'eina per defecte per inspeccionar qualsevol cosa.

less /var/log/veloz/acces.log
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çalera

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

tail -f /var/log/veloz/app.log
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.

  1. Comptar amb wc

wc /var/log/veloz/app.log
  18432  147891  2103455 /var/log/veloz/app.log

wc (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.

  1. Buscar amb grep

grep filtra les línies que contenen un patró. És l'eina més utilitzada de tot Unix.

grep ERROR /var/log/veloz/app.log

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.

grep -n -C 2 "pasarela de pago" /var/log/veloz/app.log | head -8
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 ruta

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

  1. Extreure columnes amb cut

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

cut -d, -f3 /srv/veloz/dades/enviaments.csv | head -4
ciutat
Valencia
Sevilla
Bilbao

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 registre

Aquest ú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.

  1. Ordenar i comptar: sort i uniq

sort 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)
cut -d, -f3 /srv/veloz/dades/enviaments.csv | tail -n +2 | sort -u
Bilbao
Madrid
Sevilla
Valencia

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:

cut -d, -f3 /srv/veloz/dades/enviaments.csv | tail -n +2 | sort | uniq -c | sort -rn
    412 Madrid
    338 Valencia
    271 Sevilla
    225 Bilbao

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.

  1. Transformar amb tr i presentar amb column

tr (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:

head -5 /srv/veloz/dades/enviaments.csv | column -t -s,
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 cat d'un registre enorme. Fes servir less, head o tail. Si ja l'has llançat, Ctrl-C.
  • Fer servir uniq sense sort al 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 sort a seques. L'ordre alfabètic col·loca 100 abans que 9. Per a imports o comptadors, -n sempre.
  • Oblidar la capçalera del CSV. Apareixerà com una ciutat més anomenada ciutat; tail -n +2 l'elimina.
  • Barallar-se amb les expressions regulars sense voler. Si el teu patró conté ., [, ? o /, fes servir grep -F. I a tail, recorda que en registres que roten a mitjanit l'opció correcta és -F, no -f.
  • Comptar amb grep -c creient 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 # 4

A (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

grep incidencia /srv/veloz/dades/enviaments.csv | cut -d, -f3 | sort | uniq -c | sort -rn
    47 Madrid
    31 Sevilla
    22 Valencia
    18 Bilbao

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 -t
487  alopez
412  mgarcia
347  jruiz

Aquí 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

Mòdul 2: Ordres Bàsiques de Bash

Mòdul 3: Fonaments de Scripting

Mòdul 4: Scripting Intermedi

Mòdul 5: Tècniques Avançades de Scripting

Mòdul 6: Treballar amb Eines Externes

Mòdul 7: Automatització i Programació

Mòdul 8: Bones Pràctiques i Optimització

Mòdul 9: Projectes del Món Real

© Copyright 2026. Tots els drets reservats