Al Mòdul 1 vas llegir que a Unix «el text pla és la interfície universal». Sonava a declaració de principis. A la lliçó anterior vas veure el mecanisme que la fa possible —canonades i redirecció— i aquí arriben les eines que li donen sentit: un conjunt de programes petits, escrits fa quaranta anys, que saben retallar, ordenar, comptar, substituir i agregar text, i que combinats resolen en una línia el que en un altre entorn exigiria un programa.

Aquesta és la promesa concreta de la lliçó: reserves.csv i acces.log són fitxers de text, i la Marta necessita informes. En acabar els podràs produir sense obrir un full de càlcul i sense escriure codi, i —més important— sabràs quan aquestes eines deixen de ser la resposta correcta.

Contingut

  1. cut: retallar columnes
  2. tr: traduir, esborrar i comprimir
  3. sort: ordenar de debò
  4. uniq: comptar aparicions
  5. paste, join i comm: comparar llistats
  6. sed: l'editor de flux
  7. awk: el llenguatge dels camps
  8. Taula de decisió: quina eina i quan
  9. Cas A: informe de facturació per a la Marta
  10. Casos B i C: rutes amb errors i IP anòmales

  1. cut: retallar columnes

Extreu parts de cada línia, per camps o per caràcters.

Opció Efecte
-d';' delimitador (per defecte, el tabulador)
-f2,4 / -f2-5 camps: llista o rang
-c1-10 per posició de caràcter
--complement tot menys el que s'indica
--output-delimiter=X separador de la sortida
operador@srv-tramontana:~$ head -3 /home/operador/dades/reserves.csv
id;data;casa;hoste;nits;import
1001;2026-07-03;mas-figueres;Nuria Bosch;4;520.00
1002;2026-07-05;can-ventos;Pere Rius;2;240.00
operador@srv-tramontana:~$ cut -d';' -f3,6 /home/operador/dades/reserves.csv | head -2
casa;import
mas-figueres;520.00

cut és rapidíssim i té un límit seriós: no entén delimitadors repetits. Amb un fitxer alineat per espais, cada espai de més compta com un camp buit:

operador@srv-tramontana:~$ echo 'GET   /reserves   200' | cut -d' ' -f2

Sortida buida: el camp 2 és l'espai entre GET i el següent. Per a sortides separades per espais variables —que és la de gairebé qualsevol ordre— l'eina correcta és awk, que tracta qualsevol bloc de blancs com un únic separador. cut per a formats amb delimitador fix (CSV, /etc/passwd); awk per a tota la resta.

  1. tr: traduir, esborrar i comprimir

tr opera caràcter a caràcter i només llegeix de stdin.

operador@srv-tramontana:~$ echo 'GET   /reserves   200' | tr -s ' ' | cut -d' ' -f2
/reserves
Opció Efecte
tr 'a' 'b' tradueix caràcter per caràcter
-d 'X' esborra els caràcters indicats
-s 'X' comprimeix repeticions consecutives en una
-c complement: actua sobre els no llistats

Ja l'has vist en acció: tr -s ' ' resol el problema de cut de l'apartat anterior. Altres usos habituals: tr -d '\r' per netejar fitxers que vénen de Windows —una font clàssica de fallades incomprensibles— i tr -cd '[:print:]\n' per eliminar caràcters de control d'un abocament.

  1. sort: ordenar de debò

Opció Efecte
-n numèric
-h numèric amb sufixos humans (4K, 2M, 1G)
-V per número de versió (3.2.1 abans que 3.10.0)
-r invertit
-u elimina duplicats
-f ignora majúscules
-t';' delimitador de camps
-k3,3 ordena pel camp 3
-o fitxer escriu la sortida (permet el mateix fitxer d'entrada)
-s estable: no reordena el que ja estava empatat

La sintaxi de -k és la que més es malinterpreta. -kN significa «des del camp N fins al final de la línia», no «pel camp N». Per ordenar només per un camp cal escriure -kN,N.

operador@srv-tramontana:~$ tail -n +2 /home/operador/dades/reserves.csv | sort -t';' -k6,6nr | head -3
1001;2026-07-03;mas-figueres;Nuria Bosch;4;520.00
1014;2026-08-02;mas-figueres;Jordi Camps;4;520.00
1007;2026-07-19;la-solana;Anna Serra;3;435.50

-t';' fixa el separador, -k6,6nr ordena pel camp 6 de manera numèrica i inversa. Els modificadors n i r s'enganxen al -k perquè s'apliquin només a aquell camp; posats solts afectarien tota la línia.

-V és específic i molt útil en el nostre cas: ls /opt/tramontana/releases/ | sort -V ordena 3.1.0, 3.2.0, 3.2.1, 3.3.0 correctament, mentre que un sort normal posaria 3.10.0 abans que 3.2.0.

Recorda de 03-01 que el resultat de sort depèn de la configuració regional. Quan la sortida s'hagi de comparar o versionar, LC_ALL=C sort.

  1. uniq: comptar aparicions

Opció Efecte
-c prefixa cada línia amb el seu nombre de repeticions
-d només les línies duplicades
-u només les que apareixen un cop
-i ignora majúscules
-f N ignora els N primers camps en comparar

uniq només compara línies adjacents. No és un defecte: és el que li permet processar fitxers enormes sense memòria. La conseqüència és que exigeix entrada ordenada.

operador@srv-tramontana:~$ printf 'a\nb\na\n' | uniq -c | tr '\n' ' '
      1 a       1 b       1 a
operador@srv-tramontana:~$ printf 'a\nb\na\n' | sort | uniq -c | tr '\n' ' '
      2 a       1 b

D'aquí el cavall de batalla de l'anàlisi de registres, que ja vas fer servir sense explicació:

sort | uniq -c | sort -rn

Agrupa el que és igual, compta cada grup i ordena per freqüència descendent. És la resposta a qualsevol pregunta de la forma «què és el que més es repeteix?».

  1. paste, join i comm: comparar llistats

paste enganxa fitxers costat per costat (paste -d';' a.txt b.txt). join fa una unió relacional per un camp comú i exigeix tots dos fitxers ordenats per ell. comm compara dos fitxers ordenats i produeix tres columnes: només al primer, només al segon, a tots dos.

operador@srv-tramontana:~$ cut -d';' -f3 /home/operador/dades/reserves.csv | tail -n +2 | sort -u > /tmp/amb-reserves.txt
operador@srv-tramontana:~$ comm -23 <(sort /home/operador/dades/cases.txt) /tmp/amb-reserves.txt

Sense sortida: les cinc cases del catàleg tenen almenys una reserva. -23 suprimeix les columnes 2 i 3 i deixa només «al catàleg però sense reserves», que és exactament la pregunta. <(...) és una substitució de procés: Bash lliura la sortida d'aquella ordre com si fos un fitxer, cosa que evita crear temporals.

  1. sed: l'editor de flux

sed llegeix l'entrada línia a línia, i per a cadascuna executa les ordres que li has donat i, tret que li diguis el contrari, la imprimeix. Aquest cicle ho explica tot: sed no carrega el fitxer a la memòria, per això processa fitxers de gigabytes.

Adreces

Adreça Selecciona
5 la línia 5
2,10 de la 2 a la 10
$ l'última
/regex/ les que coincideixen
/inici/,/fi/ des d'una fins a una altra
2~3 la 2 i després cada 3
/regex/! les que no coincideixen

L'ordre s

s/patró/reemplaçament/indicadors, amb aquests indicadors:

Indicador Efecte
g totes les ocurrències de la línia, no només la primera
i ignora majúscules
p imprimeix la línia modificada (útil amb -n)
3 només la tercera ocurrència
w f escriu les línies modificades a f

El delimitador no ha de ser per força /: qualsevol caràcter serveix, i fer-ne servir un altre evita la «tanca de barres» quan el patró conté rutes.

operador@srv-tramontana:~$ echo '/opt/tramontana/releases/3.2.1' | sed 's|/opt/tramontana|/srv/app|'
/srv/app/releases/3.2.1

Els grups de captura funcionen com a les expressions regulars: \1, \2… els reutilitzen al reemplaçament i & representa tot el que ha coincidit. Amb -E no cal escapar parèntesis ni claus:

operador@srv-tramontana:~$ echo '1001;2026-07-03;mas-figueres' | sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3\/\2\/\1/'
1001;03/07/2026;mas-figueres

Altres ordres

Ordre Fa
d esborra (no imprimeix) la línia
p imprimeix; combina-la amb -n
a text / i text afegeix després / insereix abans
c text reemplaça la línia sencera
y/abc/xyz/ tradueix caràcter a caràcter, com tr
q surt (amb sed '100q' talles a la línia 100)
operador@srv-tramontana:~$ sed -e '1d' -e 's/;/ | /g' /home/operador/dades/reserves.csv | head -1
1001 | 2026-07-03 | mas-figueres | Nuria Bosch | 4 | 520.00

Amb -n, sed no imprimeix res pel seu compte i només surt el que p selecciona: sed -n '/ERROR 500/p' errors.log retorna les 41 línies d'error, és a dir, sed imitant grep. Diverses ordres s'encadenen amb -e repetit o separant-les amb ;.

Edició al lloc: per què -i.bak és obligatori

sed -i modifica el fitxer directament. En producció, mai sense sufix.

operador@srv-tramontana:~$ sudo sed -i.bak-$(date +%F) 's/^log_nivell=debug$/log_nivell=info/' /etc/tramontana/app.conf
operador@srv-tramontana:~$ sudo diff -u /etc/tramontana/app.conf.bak-2026-08-18 /etc/tramontana/app.conf
@@ -6,2 +6,2 @@
-log_nivell=debug
+log_nivell=info

Amb -i.bak-$(date +%F), sed guarda l'original amb aquell sufix abans d'escriure. Sense això, si el patró estava malament —i un patró mal escrit pot buidar mig fitxer sense avisar— no hi ha marxa enrere: sed no pregunta, no avisa i no desfà. La convenció de còpia prèvia del curs i aquesta opció són el mateix, integrat en una sola ordre. Fixa't a més en les àncores ^ i $: sense elles, el patró coincidiria també dins d'un comentari.

El procediment correcte és sempre en dos passos: executar sed sense -i per veure el resultat a la pantalla, i només llavors afegir-hi -i.bak-....

  1. awk: el llenguatge dels camps

awk és un llenguatge de programació complet disfressat d'ordre. El seu model és:

awk 'patró { acció }' fitxer

Per a cada línia, si el patró es compleix, executa l'acció. Sense patró, s'aplica a totes; sense acció, imprimeix la línia.

Camps i variables

Variable Conté
$0 la línia sencera
$1, $2… $NF els camps; $NF és l'últim
NF nombre de camps de la línia
NR número de línia
FS / OFS separador d'entrada / de sortida
FILENAME nom del fitxer actual

Per defecte FS és «qualsevol bloc d'espais o tabuladors», que és justament el que cut no sap fer:

operador@srv-tramontana:~$ awk '{print $3, $4}' /var/log/tramontana/acces.log | head -2
GET /reserves/1012
POST /reserves

Per a CSV es canvia amb -F';'. Els blocs BEGIN i END s'executen abans de la primera línia i després de l'última:

operador@srv-tramontana:~$ awk -F';' 'NR>1 {n++; s+=$6} END {printf "%d reserves, %.2f EUR, mitjana %.2f\n", n, s, s/n}' \
    /home/operador/dades/reserves.csv
25 reserves, 7842.50 EUR, mitjana 313.70

NR>1 salta la capçalera —un patró sense claus és una condició—, les variables es creen soles amb valor 0, i printf dona format: %d enter, %.2f decimal amb dues xifres.

Condicions i matrius associatives

awk -F';' '$5 >= 5 {print $1, $3, $5}' reserves.csv retorna les tres estades de cinc nits o més. I ara la característica que fa d'awk una cosa diferent: les matrius associatives, que permeten agrupar i sumar en una sola passada.

operador@srv-tramontana:~$ awk -F';' 'NR>1 {total[$3]+=$6} END {for (c in total) printf "%-14s %8.2f\n", c, total[c]}' \
    /home/operador/dades/reserves.csv | sort -k2 -nr
mas-figueres    2450.00
can-ventos      1980.00
la-solana       1425.50
cal-ferrer      1120.00
el-moli          867.00

total[$3]+=$6 fa servir el nom de la casa com a índex: no cal declarar res ni saber per endavant quantes cases hi ha. El bucle for (c in total) recorre les claus —en ordre impredictible, d'aquí el sort final— i %-14s alinea a l'esquerra en 14 caràcters.

Per què awk substitueix mitja canonada: aquesta ordre fa en una passada el que exigiria cut | sort | uniq més una suma que cap de les tres no sap fer. Quan necessitis agrupar i calcular alhora, awk no és una opció entre d'altres: és l'única del conjunt que pot.

  1. Taula de decisió: quina eina i quan

Necessito Eina
Retallar camps amb delimitador fix cut
Retallar camps separats per espais variables awk '{print $N}'
Canviar o esborrar caràcters solts tr
Filtrar línies per un patró grep
Substituir text en moltes línies sed
Ordenar, deduplicar, comptar freqüències sort + uniq -c
Sumar, fer mitjanes, agrupar per clau awk
Condicions sobre diversos camps alhora awk
Diversos fitxers, JSON, estat complex, més de 20 línies Python

L'última fila és un consell professional, no una rendició. Una canonada de sis baules amb dos sed imbricats és més difícil de mantenir que quinze línies de Python llegible. El punt de tall raonable: si no cap en una pantalla o si l'has de dibuixar per entendre-la, canvia d'eina. I per a JSON, ni ho intentis amb sed: existeix jq.

  1. Cas A: informe de facturació per a la Marta

L'encàrrec: total facturat, mitjana de nits i import per casa del període carregat a reserves.csv. Es construeix per passos, verificant.

Verificació prèvia amb awk -F';' 'NR>1 {n++} END {print n, NF}': 25 registres i 6 camps. Si alguna línia no en tingués 6, qualsevol suma posterior estaria malament; la validació de 03-02 ja ens va dir que el format és correcte.

operador@srv-tramontana:~$ awk -F';' '
  NR>1 { res[$3]++; nit[$3]+=$5; imp[$3]+=$6; tn+=$5; ti+=$6; tr_++ }
  END {
    printf "%-14s %5s %7s %10s\n", "CASA", "RES", "NITS", "IMPORT"
    for (c in res) printf "%-14s %5d %7d %10.2f\n", c, res[c], nit[c], imp[c]
    printf "%-14s %5d %7d %10.2f\n", "TOTAL", tr_, tn, ti
    printf "Mitjana de nits per reserva: %.2f\n", tn/tr_
  }' /home/operador/dades/reserves.csv
CASA             RES    NITS     IMPORT
mas-figueres       7      21    2450.00
can-ventos         6      17    1980.00
la-solana          5      13    1425.50
cal-ferrer         4      11    1120.00
el-moli            3       8     867.00
TOTAL             25      70    7842.50
Mitjana de nits per reserva: 2.80

Tres matrius associatives indexades per la mateixa clau, tres acumuladors globals i un END que formata. El programa d'awk va entre cometes simples i pot ocupar diverses línies: Bash no toca res del que hi ha a dins. Fixa't que la variable es diu tr_ i no tr: dins d'awk no hi ha conflicte amb l'ordre, però evitar noms que coincideixen amb ordres estalvia confusió en rellegir-ho.

Comprovació final imprescindible: 7+6+5+4+3 = 25 reserves i les sumes parcials donen el total. Un informe el desglossament del qual no quadra amb el total no s'entrega.

  1. Casos B i C: rutes amb errors i IP anòmales

B) Rutes amb més errors. Ampliem la canonada de 03-04 a tots els codis 4xx i 5xx:

operador@srv-tramontana:~$ awk '$5 ~ /^[45][0-9][0-9]$/ {print $5, $4}' /var/log/tramontana/acces.log \
    | sort | uniq -c | sort -rn | head -10
      9 500 /reserves
      5 503 /reserves/pagament
      4 500 /reserves/pagament
      4 404 /cases/el-molí
      1 500 /cases

Cinc combinacions, no deu: el llistat és curt perquè el registre ho és. Sumen 23, i els 500 sumen 14, que és exactament el que vam comptar a 03-04. $5 ~ /regex/ és la comparació per patró d'awk, aplicada només al camp del codi d'estat, cosa que evita el problema que a 03-02 resolíem envoltant el patró d'espais. I hi ha una troballa lateral: els quatre 404 de /cases/el-molí porten accent, mentre que al catàleg la casa és el-moli. Algú està generant enllaços amb el nom accentuat. No és una fallada del servidor: és una fallada de l'aplicació, i cal dir-l'hi a en Luis.

C) IP amb més peticions.

operador@srv-tramontana:~$ awk -F'ip=' '{split($2, a, " "); c[a[1]]++} END {for (i in c) print c[i], i}' \
    /var/log/tramontana/acces.log | sort -rn | head -5
138 10.0.2.77
94 10.0.2.31
61 10.0.2.44
38 10.0.2.52
27 10.0.2.18

-F'ip=' parteix cada línia per aquella cadena, i split($2, a, " ") talla la resta pel primer espai per quedar-se amb la IP. És una manera d'extreure un camp amb nom sense dependre de la seva posició.

La lectura de la dada és el que importa. 10.0.2.77 acumula 138 de 412 peticions —el 33 %— davant les 94 de la segona. És un atac? Encara no ho sabem, i dir que sí seria precipitat. Mirem què fa:

operador@srv-tramontana:~$ grep 'ip=10.0.2.77' /var/log/tramontana/acces.log \
    | awk '{print $3, $4, $5}' | sort | uniq -c | sort -rn | head -3
    124 GET /reserves 200
      9 GET /reserves 500
      5 POST /reserves/pagament 503

Un patró uniforme, gairebé tot GET /reserves amb èxit i a ritme constant: s'assembla més a un sistema automatitzat —un monitor, un rastrejador, una integració— que a una persona. L'informe per a la Marta ha de dir això i res més: hi ha una IP que concentra un terç del trànsit amb un patró automatitzat; les dades disponibles no permeten distingir un servei legítim d'un abús; cal identificar de qui és aquella adreça abans de prendre cap mesura. Distingir el que les dades demostren del que suggereixen és part de la feina.

Errors Comuns i Consells

  • uniq -c sense sort al davant. Només agrupa línies adjacents; el recompte sortirà fragmentat i semblarà correcte.
  • sort -k3 esperant ordenar pel camp 3. Ordena des del 3 fins al final. Escriu -k3,3.
  • cut -d' ' sobre sortida alineada. Els espais repetits creen camps buits. Fes servir tr -s ' ' o awk.
  • sed -i sense sufix de còpia. No hi ha desfer. Sempre -i.bak-$(date +%F), i prova abans sense -i.
  • Oblidar NR>1 en un CSV amb capçalera. A awk una cadena val 0, així que no dona error: falseja el recompte en silenci.
  • Posar un programa d'awk entre cometes dobles. Bash expandirà $1. Cometes simples sempre.
  • Comparar números com a text. sort sense -n posa 100 abans que 20. I ordena primer, formata després: el farciment de printf desalinea els camps de sort.
  • Consell: deixa un wc -l al final mentre construeixes una canonada; si el número canvia on no esperaves, l'error és allà. I recorda que awk accepta diversos fitxers: FILENAME diu quin processa i FNR és el número de línia dins d'aquell fitxer, davant de NR, que és global.

Exercicis

Exercici 1. Genera un llistat de les cases ordenat per import mitjà per nit (import total dividit entre nits totals), de major a menor, amb dos decimals. Explica per què no n'hi ha prou de dividir la mitjana d'imports entre la mitjana de nits.

Exercici 2. El fitxer /etc/tramontana/app.conf té max_connexions=200 i timeout_consulta=30. Puja'ls a 400 i 60 respectivament en una sola ordre, amb còpia prèvia i verificació, i explica cada element del patró que facis servir.

Exercici 3. La Marta pregunta quin percentatge de les peticions d'acces.log va acabar en error (4xx o 5xx) i en quina franja horària es concentren. Respon amb una sola canonada per a cada pregunta i redacta la conclusió en dues frases.

Solucions

Solució 1.

Un primer intent amb printf "%-14s %7.2f\n", c, imp[c]/nit[c] i sort -k2 -nr surt desordenat: -k2 significa «des del camp 2 fins al final», i com que %-14s omple amb espais, el camp 2 no comença on sort es pensa. La correcció:

operador@srv-tramontana:~$ awk -F';' 'NR>1 {nit[$3]+=$5; imp[$3]+=$6}
  END {for (c in nit) printf "%.2f %s\n", imp[c]/nit[c], c}' \
  /home/operador/dades/reserves.csv | sort -rn
116.67 mas-figueres
116.47 can-ventos
109.65 la-solana
108.38 el-moli
101.82 cal-ferrer

Posant el número primer i sense farciment, sort -rn funciona sense ambigüitat. És una tècnica que convé adoptar: ordena primer, formata després.

Sobre la pregunta: no n'hi ha prou de dividir mitjanes perquè la mitjana de quocients no és el quocient de mitjanes. Una reserva de 7 nits pesa molt més al total de nits que una de 2, i dividir promitjos les tracta totes dues igual. El càlcul correcte és el que hem fet, sumant imports i nits per separat i dividint els totals.

Solució 2.

operador@srv-tramontana:~$ sudo sed -E 's/^(max_connexions)=200$/\1=400/; s/^(timeout_consulta)=30$/\1=60/' \
    /etc/tramontana/app.conf | grep -E 'max_connexions|timeout_consulta'
max_connexions=400
timeout_consulta=60
operador@srv-tramontana:~$ sudo sed -i.bak-$(date +%F) -E \
    's/^(max_connexions)=200$/\1=400/; s/^(timeout_consulta)=30$/\1=60/' /etc/tramontana/app.conf
operador@srv-tramontana:~$ sudo diff -u /etc/tramontana/app.conf.bak-2026-08-18 /etc/tramontana/app.conf
@@ -4,2 +4,2 @@
-max_connexions=200
-timeout_consulta=30
+max_connexions=400
+timeout_consulta=60

Cada element: -E per no escapar els parèntesis; ^ i $ perquè el patró coincideixi amb la línia sencera i no amb un fragment dins d'un comentari; el grup (clau) i el seu \1 per no repetir el nom al reemplaçament, cosa que evita errades; el valor antic al patró, que actua com a comprovació —si el fitxer ja tingués un altre valor, la substitució no s'aplicaria en comptes de trepitjar-lo a cegues—; ; per encadenar dues substitucions en una sola ordre; i -i.bak-$(date +%F) per a la còpia. La primera ordre, sense -i, és la prova en sec: només quan la seva sortida és l'esperada s'executa la segona.

Solució 3.

operador@srv-tramontana:~$ awk '$5 ~ /^[45]/ {e++} END {printf "%d de %d peticions: %.1f%%\n", e, NR, 100*e/NR}' \
    /var/log/tramontana/acces.log
23 de 412 peticions: 5.6%
operador@srv-tramontana:~$ awk '$5 ~ /^[45]/ {print substr($2,1,2)":00"}' /var/log/tramontana/acces.log \
    | sort | uniq -c | sort -rn | head -4
     15 03:00
      4 11:00
      2 09:00
      2 17:00

substr($2,1,2) pren els dos primers caràcters del camp de l'hora. %% imprimeix un percentatge literal a printf.

El 5,6 % de les 412 peticions registrades va acabar en error, una proporció que per si sola no és alarmant. Ara bé, 15 dels 23 errors —gairebé dos terços— es concentren a la franja de les 03:00, cosa que apunta a un problema puntual durant la finestra nocturna i no a una degradació general del servei.

Aquesta concentració encaixa amb el que veníem veient: els db_timeout d'errors.log, el timeout_consulta=30 esgotat i les connexions_actives=200 al límit configurat. Tot assenyala la tasca nocturna que competeix per les connexions de la base de dades amb les peticions dels usuaris.

Conclusió

Has convertit dos fitxers de text en informes defensables, i de passada has tancat el cercle que va obrir la filosofia Unix del Mòdul 1: el text pla com a interfície universal entre programes que no es coneixen.

  • cut retalla per delimitador fix, amb el seu límit davant de delimitadors repetits; tr tradueix, esborra i comprimeix caràcters.
  • sort ordena per camp amb la sintaxi real -kN,N, amb -n, -h, -V, -u i -o; uniq -c compta i exigeix entrada ordenada, i el patró sort | uniq -c | sort -rn respon a qualsevol pregunta de freqüència.
  • Coneixes paste, join i comm per comparar llistats, i la substitució de procés <(...) per no crear temporals.
  • sed processa línia a línia; maneges adreces, l'ordre s amb els seus indicadors i delimitadors alternatius, d, p amb -n, els grups de captura, i saps que -i.bak-$(date +%F) no és opcional i que abans va sempre la prova sense -i.
  • awk et dona patró { acció }, els camps $1…$NF, NR, NF, FS, BEGIN/END, printf i les matrius associatives que agrupen i sumen en una passada, substituint mitja canonada.
  • Tens una taula de decisió i un criteri per saber quan toca passar a Python.
  • I has produït tres informes reals: la facturació per casa amb el seu desglossament quadrat, les rutes amb més errors —descobrint de passada una fallada de l'aplicació amb l'accent d'el-molí— i la IP que concentra un terç del trànsit, amb l'honestedat de dir què demostren les dades i què només suggereixen.

Fins aquí has treballat amb fitxers. La lliçó següent canvia d'objecte: Gestió de Processos s'ocupa dels programes en execució. Veuràs què és un PID i com s'organitza l'arbre de processos des de systemd, com llegir ps aux i top columna a columna —inclòs què signifiquen de debò els tres números de la càrrega mitjana—, quins senyals existeixen i per què un professional prova SIGTERM i espera abans de recórrer a kill -9, i com esbrinar amb lsof quin procés té ocupat un port o un fitxer. El cas pràctic ja t'hi esperarà plantejat: l'aplicació de Tramontana es queda penjada de matinada, just en aquella franja de les 03:00 que acabes d'identificar, i cal diagnosticar-la i reiniciar-la sense perdre les peticions en curs.

Curs de Linux: De Principiant a Administrador de Sistemes

Mòdul 1: Introducció a Linux

Mòdul 2: Comandes Bàsiques de Linux

Mòdul 3: Habilitats Avançades en la Línia de Comandes

Mòdul 4: Scripting en Shell

Mòdul 5: Administració del Sistema

Mòdul 6: Xarxes i Seguretat

Mòdul 7: Temes Avançats

Mòdul 8: Projectes Pràctics

© Copyright 2026. Tots els drets reservats