Ja saps com processa Bash una línia abans de llançar-la: expandeix variables, substitueix ordres, parteix per espais. Aquesta lliçó hi afegeix la peça més potent d'aquest processament —el globbing— i tot seguit una cosa que s'hi assembla molt i que no hi té res a veure: les expressions regulars.

Confondre-les és l'error més estès entre qui porta anys fent servir el terminal. S'assemblen perquè totes dues fan servir * i ?, i signifiquen coses diferents en cadascuna. La confusió no és acadèmica: produeix ordres que semblen funcionar, retornen alguna cosa plausible i estan malament. En acabar aquesta lliçó tindràs la distinció gravada, sabràs descriure qualsevol conjunt de fitxers amb un patró i construir expressions regulars que resisteixin casos reals sobre acces.log i reserves.csv.

Contingut

  1. Qui expandeix què: el shell abans, el programa després
  2. Globbing: els comodins del shell
  3. Classes POSIX i expansió de claus
  4. Opcions de globbing: globstar, dotglob, nullglob, failglob
  5. Expressions regulars: BRE, ERE i PCRE
  6. Els metacaràcters, un per un
  7. Agrupació, alternança i retroreferències
  8. Cobdícia: quan l'expressió regular s'emporta de més
  9. Mètode per construir una expressió regular per passos
  10. Expressions regulars pràctiques del fil conductor

  1. Qui expandeix què: el shell abans, el programa després

La regla, en una frase: el globbing el fa Bash sobre noms de fitxer abans d'executar l'ordre; les expressions regulars les interpreta el programa sobre el text que rep.

L'ordre no arriba a veure mai el comodí. Comprova-ho amb una ordre que no fa res més que imprimir els seus arguments:

operador@srv-tramontana:~$ cd /var/log/tramontana && echo *.log
acces.log errors.log
operador@srv-tramontana:~$ echo '*.log'
*.log

En el primer cas echo va rebre dos arguments ja resolts. En el segon, les cometes van impedir el globbing i va rebre el literal. Aquesta és la raó que ls *.log i grep '.*\.log' fitxer no s'assemblin gens: el primer demana fitxers al shell, el segon demana al programa que busqui un patró dins del text.

operador@srv-tramontana:~$ grep -c 'GET' *.log
acces.log:298
errors.log:0

Aquí hi conviuen les dues coses: *.log el va expandir Bash (per això grep sap que hi ha dos fitxers i en prefixa el nom), mentre que GET és el patró que interpreta grep. Quan un patró és per al programa, va entre cometes simples. Sempre. Si escrius grep *.log fitxer sense cometes i existeix un acces.log al directori, Bash el substitueix i grep acaba buscant la cadena «acces.log» dins d'errors.log. Un resultat plausible i erroni.

Globbing Expressió regular
El processa Bash el programa (grep, sed, awk…)
Actua sobre noms de fitxer existents qualsevol text
* significa qualsevol seqüència de caràcters zero o més de l'element anterior
? significa exactament un caràcter zero o una aparició de l'anterior
Ha de coincidir el nom sencer per defecte, qualsevol part de la línia
Si no coincideix res el patró es passa literal el programa no retorna resultats

Les dues últimes files són subtils i valen el seu pes en or. Un glob ha de coincidir amb el nom complet, mentre que grep 'GET' coincideix amb qualsevol línia que contingui aquesta cadena en qualsevol posició.

  1. Globbing: els comodins del shell

Comodí Coincideix amb Exemple a Tramontana
* qualsevol seqüència, inclosa la buida *.log → acces.log errors.log
? exactament un caràcter 3.2.? → 3.2.0 3.2.1
[abc] un dels caràcters llistats informe-[12].txt
[a-z] un del rang [0-9]*.csv
[!abc] o [^abc] un que no sigui a la llista [!.]*
operador@srv-tramontana:~$ ls /opt/tramontana/releases/
3.1.0  3.2.0  3.2.1  3.3.0
operador@srv-tramontana:~$ ls -d /opt/tramontana/releases/3.2.*
/opt/tramontana/releases/3.2.0  /opt/tramontana/releases/3.2.1
operador@srv-tramontana:~$ ls -d /opt/tramontana/releases/3.[13].0
/opt/tramontana/releases/3.1.0  /opt/tramontana/releases/3.3.0

Tres propietats del globbing que cal tenir presents:

  • * no travessa les barres /. /opt/*/app no troba res imbricat a més profunditat; per a això hi ha **, que veuràs a l'apartat 4.
  • Els fitxers ocults no coincideixen amb *. echo * al teu $HOME no llista .bashrc. És deliberat: evita que un rm * s'emporti la configuració per davant.
  • El resultat va ordenat segons la configuració regional, amb les conseqüències que ja coneixes de 03-01.

La convenció del curs —mirar amb ls abans d'un rm— és exactament una comprovació de globbing: executes el patró amb una ordre inofensiva i veus què hauria rebut la perillosa.

operador@srv-tramontana:~$ ls /srv/tramontana/backups/temporals/*.tmp
/srv/tramontana/backups/temporals/export-1.tmp
/srv/tramontana/backups/temporals/export-2.tmp
operador@srv-tramontana:~$ rm /srv/tramontana/backups/temporals/*.tmp

  1. Classes POSIX i expansió de claus

Dins dels claudàtors pots fer servir classes amb nom, més llegibles i correctes amb accents que un rang fet a mà:

Classe Equival a
[[:digit:]] 0-9
[[:alpha:]] lletres, incloses les accentuades de la configuració regional
[[:alnum:]] lletres i dígits
[[:space:]] espai, tabulador, salt de línia
[[:upper:]] / [[:lower:]] majúscules / minúscules
[[:punct:]] signes de puntuació

Els dobles claudàtors despisten: els externs són els del conjunt, els interns formen part del nom de la classe. Es combina amb altres caràcters dins del mateix conjunt: [[:digit:]-] coincideix amb un dígit o un guionet.

L'expansió de claus no és globbing

{a,b} i {1..10} s'assemblen als comodins i són una altra cosa: generen text, existeixin o no els fitxers. Passa abans que el globbing.

operador@srv-tramontana:~$ echo informe-{gener,febrer,marc}.txt
informe-gener.txt informe-febrer.txt informe-marc.txt
operador@srv-tramontana:~$ echo /home/operador/treball/2026/{07,08,09}/{informes,dades}
/home/operador/treball/2026/07/informes /home/operador/treball/2026/07/dades
/home/operador/treball/2026/08/informes /home/operador/treball/2026/08/dades
/home/operador/treball/2026/09/informes /home/operador/treball/2026/09/dades

(La sortida real va en una sola línia; aquí està partida perquè es llegeixi.) Aquesta estructura de directoris que ja tens es va crear exactament així, amb mkdir -p i una expansió de claus. Els rangs accepten pas: {1..10}, {a..e}, {0..30..5}.

L'ús més rendible del dia a dia és evitar repetir una ruta llarga:

operador@srv-tramontana:~$ cp /etc/tramontana/app.conf{,.bak-$(date +%F)}
operador@srv-tramontana:~$ ls /etc/tramontana/
app.conf  app.conf.bak-2026-08-18

La clau {,.bak-...} s'expandeix a dos arguments: l'original i l'original amb sufix. És la forma abreujada de la convenció de còpies del curs.

  1. Opcions de globbing: globstar, dotglob, nullglob, failglob

S'activen amb shopt -s i es desactiven amb shopt -u.

Opció Efecte
globstar habilita **, que sí que travessa barres i recorre subdirectoris
dotglob fa que * inclogui els fitxers ocults
nullglob si el patró no coincideix amb res, s'expandeix a res en comptes de quedar-se literal
failglob si el patró no coincideix amb res, l'ordre no s'executa i dona error
nocaseglob globbing insensible a majúscules
extglob patrons estesos: !(patró), +(patró), `@(a
operador@srv-tramontana:~$ shopt -s globstar
operador@srv-tramontana:~$ ls /opt/tramontana/releases/**/*.html
/opt/tramontana/releases/3.2.1/plantilles/confirmacio.html
/opt/tramontana/releases/3.2.1/plantilles/factura.html

Què passa per defecte quan un patró no coincideix amb res

Aquest comportament sorprèn i convé entendre'l abans de patir-lo. Per defecte, si un glob no troba res, Bash el deixa tal qual i el passa a l'ordre com a text literal:

operador@srv-tramontana:~$ ls /var/log/tramontana/*.gz
ls: cannot access '/var/log/tramontana/*.gz': No such file or directory

Fixa't que el missatge conté l'asterisc: ls va rebre el patró sense expandir i va intentar obrir un fitxer anomenat literalment *.gz. Amb ls és inofensiu; amb una ordre destructiva, no tant. Imagina rm /srv/tramontana/backups/temporals/*.tmp quan ja no queda cap .tmp: en el millor cas dona error, però una ordre que interpretés l'argument d'una altra manera podria fer alguna cosa inesperada.

  • nullglob és el que vols quan el patró pot legítimament no coincidir amb res.
  • failglob és el més segur en treball interactiu: l'ordre avorta abans d'executar-se.
operador@srv-tramontana:~$ shopt -s failglob
operador@srv-tramontana:~$ ls /var/log/tramontana/*.gz
bash: no match: /var/log/tramontana/*.gz

Ara és Bash qui s'hi nega, i ls no va arribar a executar-se.

  1. Expressions regulars: BRE, ERE i PCRE

Una expressió regular descriu un conjunt de cadenes. El problema històric és que hi ha tres dialectes i les eines d'Unix no coincideixen en quin fan servir.

BRE (bàsica) ERE (estesa) PCRE (Perl)
Es fa servir a grep, sed grep -E, sed -E, awk grep -P
+ ? {} () ` ` cal escapar-los: \+ \? funcionen directament
\d \w \s no no sí
\b (vora de paraula) sí sí sí
Mandrós *? no no sí

És a dir: en BRE els parèntesis són literals i \\( és el metacaràcter; en ERE és al revés. D'aquí que la mateixa expressió doni resultats diferents amb i sense -E:

operador@srv-tramontana:~$ grep -c 'GET\|POST' acces.log
412
operador@srv-tramontana:~$ grep -Ec 'GET|POST' acces.log
412
operador@srv-tramontana:~$ grep -c 'GET|POST' acces.log
0

El tercer busca la cadena literal GET|POST, que no apareix mai. Recomanació ferma: fes servir sempre grep -E. Escrius menys barres, es llegeix millor i és la sintaxi que comparteixen awk, egrep i gairebé qualsevol llenguatge modern. Reserva -P per al que només PCRE ofereix (\d, mandrosos, lookahead), sabent que no està disponible a totes les màquines.

  1. Els metacaràcters, un per un

Treballem sobre /var/log/tramontana/acces.log, amb aquest format:

operador@srv-tramontana:~$ head -3 /var/log/tramontana/acces.log
2026-08-18 09:14:02 GET /reserves/1012 200 ip=10.0.2.31 ms=48
2026-08-18 09:14:07 POST /reserves 201 ip=10.0.2.31 ms=134
2026-08-18 09:14:19 GET /cases/mas-figueres 200 ip=10.0.2.44 ms=22
Metacaràcter Significa Exemple Coincideix amb
. un caràcter qualsevol 2.6 2026, 216, 2x6
^ principi de línia ^2026-08-18 línies d'aquell dia
$ final de línia ms=[0-9]+$ el camp final
[] un del conjunt [45]0[0-9] 404, 500, 503
[^] un fora del conjunt [^0-9] qualsevol no dígit
* zero o més de l'anterior ms=[0-9]* ms= i ms=134
+ un o més de l'anterior ms=[0-9]+ només ms=134
? zero o un https? http, https
{n,m} entre n i m repeticions [0-9]{3} exactament tres dígits
| alternança GET|POST qualsevol dels dos
() agrupació (GET|POST) /reserves agrupa per a l'alternança
\. punt literal 10\.0\.2\.15 aquella IP i només aquella

La diferència entre * i + és la que més falsos positius genera: * accepta l'absència total, així que grep 'ms=[0-9]*' coincideix fins i tot amb una línia amb ms= buit.

Les escapades només existeixen a PCRE:

Escapada Equival a
\d [0-9]
\w [A-Za-z0-9_]
\s espai en blanc
\D \W \S les seves negacions
\b vora de paraula (frontera entre \w i no-\w)

\b mereix atenció perquè resol un problema constant. Buscar 200 al registre coincideix també amb ms=200 o amb /reserves/1200:

operador@srv-tramontana:~$ grep -c ' 200 ' acces.log
331
operador@srv-tramontana:~$ grep -cE '\b200\b' acces.log
338

Els espais són més restrictius que \b (que també acceptaria =200). En aquest cas el correcte és el primer, perquè el codi d'estat va sempre envoltat d'espais. L'opció -w de grep fa el mateix que envoltar tot el patró de \b.

  1. Agrupació, alternança i retroreferències

Els parèntesis fan dues coses: delimiten l'abast d'un operador i capturen el que coincideix per poder-ho reutilitzar.

operador@srv-tramontana:~$ grep -cE '^2026-08-18 09:(1[4-9]|2[0-9]):' acces.log
57

Sense parèntesis, l'alternança s'estendria fins al final del patró i 1[4-9]|2[0-9]: significaria «09:1[4-9]» o «2[0-9]:», que és una altra cosa.

Una retroreferència \1 coincideix exactament amb el mateix text que va capturar el primer grup. Serveix per detectar repeticions, que és una cosa que cap patró sense captura no pot expressar:

operador@srv-tramontana:~$ grep -nE '(\b[a-z]+\b) \1' /home/operador/dades/cases.txt

Sense sortida: no hi ha paraules duplicades. Un ús real és localitzar octets repetits o, a reserves.csv, detectar un separador doble:

operador@srv-tramontana:~$ grep -nE '(;)\1' /home/operador/dades/reserves.csv

També sense resultats, que és exactament el que volem: cap camp buit per doble punt i coma. Una cerca sense sortida és un resultat, no una fallada; convé dir-ho en veu alta perquè costa d'interioritzar.

  1. Cobdícia: quan l'expressió regular s'emporta de més

Els quantificadors *, + i {n,} són cobdiciosos: coincideixen amb el màxim possible. És la causa de l'error clàssic. Intentem extreure només la ruta d'una línia de registre amb sed (que veuràs a fons a 03-05; aquí només com a demostració):

operador@srv-tramontana:~$ echo '2026-08-18 09:14:02 GET /reserves/1012 200 ip=10.0.2.31 ms=48' \
    | sed -E 's/.*(\/.*) .*/\1/'
/reserves/1012 200 ip=10.0.2.31

Esperàvem /reserves/1012 i n'hem obtingut tres camps. El motiu: .* dins del grup es va menjar tot el que va poder mentre el patró continués coincidint globalment. La solució en ERE és prohibir el caràcter que separa, en comptes d'acceptar-ne qualsevol:

operador@srv-tramontana:~$ echo '2026-08-18 09:14:02 GET /reserves/1012 200 ip=10.0.2.31 ms=48' \
    | sed -E 's/.*(\/[^ ]*) .*/\1/'
/reserves/1012

[^ ]* no pot travessar un espai, així que el grup s'atura on toca. [^X]* en comptes de .* és la tècnica que resol el 90 % dels problemes de cobdícia i funciona en tots els dialectes.

PCRE ofereix a més quantificadors mandrosos, que coincideixen amb el mínim: .*?. Amb grep -oP '\/.*?\s' obtindries el mateix resultat. És còmode, però depèn de -P, així que en scripts portables prefereix la classe negada.

  1. Mètode per construir una expressió regular per passos

Ningú escriu una expressió regular complexa d'una tirada. El mètode és incremental i sempre igual:

  1. Mira les dades reals. head -3 del fitxer, no de memòria.
  2. Comença per la part més distintiva i comprova que coincideix amb alguna cosa: grep -E 'ip=' acces.log | head -3.
  3. Afegeix una peça cada vegada, verificant el recompte amb -c després de cada afegit. Si el número canvia de manera inesperada, el problema és a l'últim que hi vas afegir.
  4. Fes servir -o per veure exactament amb què està coincidint, no la línia sencera. És l'eina de depuració més útil que té grep.
  5. Comprova també els falsos negatius: grep -vE 'patro' fitxer | head t'ensenya el que se t'escapa. Sol ser més revelador que el que sí que coincideix.
  6. Només quan el patró està validat, fes-lo servir en alguna cosa que modifiqui dades.
operador@srv-tramontana:~$ grep -oE 'ip=[0-9.]+' acces.log | head -3
ip=10.0.2.31
ip=10.0.2.31
ip=10.0.2.44

-o imprimeix només la part que coincideix, una per línia. Amb això veus immediatament si el teu patró s'està passant o s'està quedant curt.

  1. Expressions regulars pràctiques del fil conductor

Extreure adreces IP. Una IP «ben feta» exigiria validar que cada octet és 0-255, cosa que produeix un patró il·legible. Per a registres propis, amb format conegut, això n'hi ha prou i es llegeix:

operador@srv-tramontana:~$ grep -oE 'ip=([0-9]{1,3}\.){3}[0-9]{1,3}' acces.log | head -3
ip=10.0.2.31
ip=10.0.2.31
ip=10.0.2.44

([0-9]{1,3}\.){3} és «un grup d'un a tres dígits seguit de punt, repetit tres vegades», més un últim grup sense punt. Els punts van escapats: sense la barra coincidirien amb qualsevol caràcter.

Codis d'estat d'error. Els 4xx i 5xx, que són els que interessen:

operador@srv-tramontana:~$ grep -cE ' [45][0-9]{2} ' acces.log
23
operador@srv-tramontana:~$ grep -oE ' [45][0-9]{2} ' acces.log | sort | uniq -c
      4  404
     14  500
      5  503

Els espais que envolten el patró eviten coincidir amb els tres primers dígits d'un identificador de reserva.

Dates ISO. [0-9]{4}-[0-9]{2}-[0-9]{2} n'hi ha prou per a un format controlat. Si vols restringir a mesos vàlids: [0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01]). Aquest nivell de rigor té sentit en validar entrada, no en buscar als teus propis registres.

Validar el format de reserves.csv. El fitxer té capçalera id;data;casa;hoste;nits;import i 25 registres. Una línia vàlida és: un id de quatre dígits, una data ISO, un nom de casa en minúscules amb guionets, un nom d'hoste, un nombre de nits i un import decimal.

operador@srv-tramontana:~$ grep -cvE '^[0-9]{4};[0-9]{4}-[0-9]{2}-[0-9]{2};[a-z-]+;[^;]+;[0-9]+;[0-9]+\.[0-9]{2}$' \
    /home/operador/dades/reserves.csv
1

Només una línia no valida: la capçalera, que efectivament no compleix el format d'un registre. Això confirma que els 25 registres són correctes. Fixa't en les tres decisions de disseny del patró: ^ i $ obliguen a validar la línia sencera (sense àncores, grep coincidiria amb qualsevol fragment i la validació no valdria res); [^;]+ al nom de l'hoste accepta espais i accents però no un punt i coma de més; i [0-9]+\.[0-9]{2} exigeix exactament dos decimals a l'import.

Per veure quina falla, grep -nvE '...' amb -n et dona el número de línia. Aquest patró, guardat, és una comprovació d'integritat que pots executar abans de cada importació.

Errors Comuns i Consells

  • No posar entre cometes el patró de grep. Si conté *, ? o [, Bash l'expandeix primer i busques una altra cosa. Cometes simples sempre.
  • Creure que * en una expressió regular és «qualsevol cosa». En una expressió regular, * s'aplica a l'element anterior. «Qualsevol cosa» és .*.
  • Oblidar escapar el punt en una IP o en una extensió. 10.0.2.15 coincideix també amb 10x0y2z15. Escriu 10\.0\.2\.15.
  • Fer servir .* on toca una classe negada. Si el resultat s'emporta de més, canvia .* per [^delimitador]*.
  • Barrejar dialectes. Si escrius \d sense -P, grep busca la lletra d literal i no avisa. És una fallada silenciosa.
  • Validar sense àncores. Un patró de validació sense ^ i $ no valida res.
  • Consell: quan un patró no funcioni, no el reescriguis sencer. Treu-li peces fins que coincideixi amb alguna cosa i torna-les a afegir d'una en una.
  • Consell: grep --color=always -oE 'patro' és el teu depurador. I echo 'linia de prova' | grep -E 'patro' et permet provar contra un cas inventat sense tocar el fitxer real.

Exercicis

Exercici 1. Sense fer servir find ni grep, llista amb un únic glob tots els directoris de release de la sèrie 3.2 a /opt/tramontana/releases/, i explica per què 3.2* i 3.2.* no són equivalents. Després crea amb una sola ordre l'estructura /home/operador/treball/2026/{10,11,12}/{informes,dades}.

Exercici 2. Extreu d'acces.log totes les peticions POST que hagin retornat un codi d'error (4xx o 5xx), mostrant només el mètode, la ruta i el codi. Construeix el patró per passos i mostra la verificació de cada pas.

Exercici 3. La Marta et demana assegurar que reserves.csv no tingui imports mal formats abans de la importació mensual. Escriu una comprovació que detecti imports sense exactament dos decimals, verifica que el fitxer actual està net, i demostra que el teu patró funciona provant-lo contra una línia inventada que sí que estigui malament.

Solucions

Solució 1.

operador@srv-tramontana:~$ ls -d /opt/tramontana/releases/3.2.*
/opt/tramontana/releases/3.2.0  /opt/tramontana/releases/3.2.1

3.2* coincidiria també amb un hipotètic 3.20 o 3.25, perquè * inclou la cadena buida i no exigeix el punt. 3.2.* obliga que hi hagi un punt després del 2, cosa que en un esquema de versionat semàntic és justament la diferència entre «la sèrie 3.2» i «qualsevol cosa que comenci per 3.2». Amb quatre releases l'error no es veu; amb quaranta, sí.

operador@srv-tramontana:~$ mkdir -p /home/operador/treball/2026/{10,11,12}/{informes,dades}
operador@srv-tramontana:~$ ls /home/operador/treball/2026/
07  08  09  10  11  12

L'expansió de claus genera les sis rutes i mkdir -p crea els nivells intermedis. Fixa't que això no és globbing: funciona precisament perquè els directoris encara no existeixen.

Solució 2. Pas a pas, verificant amb -c després de cada afegit:

operador@srv-tramontana:~$ grep -cE 'POST' acces.log
114
operador@srv-tramontana:~$ grep -cE 'POST /[^ ]+' acces.log
114
operador@srv-tramontana:~$ grep -cE 'POST /[^ ]+ [45][0-9]{2}' acces.log
18
operador@srv-tramontana:~$ grep -oE 'POST /[^ ]+ [45][0-9]{2}' acces.log | sort | uniq -c | sort -rn
      9 POST /reserves 500
      5 POST /reserves/pagament 503
      4 POST /reserves/pagament 500

El primer pas confirma que hi ha POST. El segon no canvia el recompte, cosa que demostra que totes les línies POST tenen una ruta amb el format esperat: si hagués baixat, tindríem línies mal formades. El tercer filtra per codi d'error: 18 de les 23 respostes errònies del registre són peticions POST. [^ ]+ en comptes de .* impedeix que la ruta es mengi la resta de la línia, i [45][0-9]{2} coincideix amb qualsevol 4xx o 5xx sense enumerar-los. -o retalla la sortida a l'essencial i la canonada final agrupa; aquest sort | uniq -c | sort -rn és el patró que estudiaràs a fons a 03-05.

Solució 3.

operador@srv-tramontana:~$ grep -nvE ';[0-9]+\.[0-9]{2}$' /home/operador/dades/reserves.csv
1:id;data;casa;hoste;nits;import

Només la capçalera. Els 25 registres tenen l'import ben format. Per excloure la capçalera de l'informe i quedar-nos només amb errors reals:

operador@srv-tramontana:~$ tail -n +2 /home/operador/dades/reserves.csv \
    | grep -nvE ';[0-9]+\.[0-9]{2}$'
operador@srv-tramontana:~$ echo "codi: $?"
codi: 1

Sense sortida i codi 1: grep no va trobar cap línia que ho incomplís, que és el resultat desitjat. tail -n +2 comença a la línia 2, saltant-se la capçalera.

La part important de l'exercici és l'última: un validador que no has vist fallar mai no està validat. Es prova contra un cas dolent conegut:

operador@srv-tramontana:~$ echo '1026;2026-08-19;can-ventos;Ana Puig;3;340.5' \
    | grep -nvE ';[0-9]+\.[0-9]{2}$'
1:1026;2026-08-19;can-ventos;Ana Puig;3;340.5

Detecta l'import amb un sol decimal. Ara saps que el patró discrimina de debò i no està retornant «tot bé» per un error de sintaxi. Prova també un cas bo (340.50) i confirma que no el marca: un validador ha de fallar quan toca i només quan toca.

Conclusió

Aquesta lliçó t'ha donat dos llenguatges de patrons i, sobretot, la frontera entre tots dos.

  • El globbing el fa Bash sobre noms de fitxer, abans d'executar res. L'ordre rep la llista ja resolta i no veu mai el comodí. Ho comproves amb echo.
  • Les expressions regulars les interpreta el programa sobre el text que rep, i per això van entre cometes simples.
  • Domines els comodins *, ?, [abc], [a-z], [!abc] i les classes POSIX, i saps que * no travessa barres ni coincideix amb ocults.
  • Distingeixes l'expansió de claus —que genera text existeixin o no els fitxers— del globbing, i fas servir {,.bak-$(date +%F)} per a les còpies de seguretat.
  • Controles globstar, dotglob, nullglob i failglob, i saps què fa Bash per defecte quan un patró no coincideix: passar-lo literal.
  • Coneixes la diferència entre BRE, ERE i PCRE, i per què la recomanació és grep -E.
  • Manegues els metacaràcters un per un, l'agrupació, l'alternança i les retroreferències \1.
  • Entens la cobdícia i saps que la solució portable és substituir .* per una classe negada [^X]*.
  • I tens un mètode per construir patrons: dades reals, una peça cada vegada, -c per comptar, -o per veure què coincideix, -v per veure el que s'escapa, i provar el validador contra un cas dolent abans de confiar-hi.

A la lliçó següent, Cerca de Fitxers i Contingut: find, locate i grep, aquests patrons deixen de ser un exercici i es converteixen en la interfície de tres eines. find recorre l'arbre de directoris aplicant criteris que inclouen globs; grep aplica expressions regulars a milions de línies en segons; i locate respon a l'instant consultant una base de dades. Sabràs quina fer servir en cada cas, com combinar-les amb xargs sense que un nom amb espais ho espatlli tot, i com localitzar a srv-tramontana els releases que cal purgar, els .bak-* dispersos pel sistema i el fitxer de configuració on algú va deixar escrita una credencial.

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