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
- Qui expandeix què: el shell abans, el programa després
- Globbing: els comodins del shell
- Classes POSIX i expansió de claus
- Opcions de globbing: globstar, dotglob, nullglob, failglob
- Expressions regulars: BRE, ERE i PCRE
- Els metacaràcters, un per un
- Agrupació, alternança i retroreferències
- Cobdícia: quan l'expressió regular s'emporta de més
- Mètode per construir una expressió regular per passos
- Expressions regulars pràctiques del fil conductor
- 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'
*.logEn 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.
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ó.
- 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.0Tres propietats del globbing que cal tenir presents:
*no travessa les barres/./opt/*/appno 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$HOMEno llista.bashrc. És deliberat: evita que unrm *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
- 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-18La 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.
- 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.htmlQuè 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 directoryFixa'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/*.gzAra és Bash qui s'hi nega, i ls no va arribar a executar-se.
- 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
0El 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.
- 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
338Els 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.
- 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.
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:
Sense sortida: no hi ha paraules duplicades. Un ús real és localitzar octets repetits o, a reserves.csv, detectar un separador doble:
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.
- 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.31Esperà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.
- 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:
- Mira les dades reals.
head -3del fitxer, no de memòria. - Comença per la part més distintiva i comprova que coincideix amb alguna cosa:
grep -E 'ip=' acces.log | head -3. - Afegeix una peça cada vegada, verificant el recompte amb
-cdesprés de cada afegit. Si el número canvia de manera inesperada, el problema és a l'últim que hi vas afegir. - Fes servir
-oper veure exactament amb què està coincidint, no la línia sencera. És l'eina de depuració més útil que tégrep. - Comprova també els falsos negatius:
grep -vE 'patro' fitxer | headt'ensenya el que se t'escapa. Sol ser més revelador que el que sí que coincideix. - 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.
- 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 503Els 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
1Nomé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.15coincideix també amb10x0y2z15. Escriu10\.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
\dsense-P,grepbusca la lletradliteral 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. Iecho '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.13.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 12L'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 500El 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;importNomé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: 1Sense 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.5Detecta 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,nullglobifailglob, 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,
-cper comptar,-oper veure què coincideix,-vper 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
- Què és Linux?
- Història de Linux
- Distribucions de Linux
- Instal·lant Linux
- Primer Contacte amb el Sistema
- Estructura del Sistema de Fitxers de Linux
Mòdul 2: Comandes Bàsiques de Linux
- Introducció a la Línia de Comandes
- Obtenir Ajuda i Documentació del Sistema
- Navegant pel Sistema de Fitxers
- Operacions amb Fitxers i Directoris
- Visualització i Edició de Fitxers
- Enllaços Durs i Simbòlics
- Permisos i Propietat dels Fitxers
Mòdul 3: Habilitats Avançades en la Línia de Comandes
- L'Entorn del Shell: Variables, Àlies i Historial
- Ús de Comodins i Expressions Regulars
- Cerca de Fitxers i Contingut: find, locate i grep
- Canonades i Redirecció
- Processament de Text: cut, sort, uniq, sed i awk
- Gestió de Processos
- Programació de Tasques amb Cron
- Comandes de Xarxa
Mòdul 4: Scripting en Shell
- Introducció al Scripting en Shell
- Variables i Tipus de Dades
- Entrada, Sortida i Arguments d'un Script
- Estructures de Control
- Funcions i Biblioteques
- Depuració i Gestió d'Errors
- Scripts de Producció: Bones Pràctiques
Mòdul 5: Administració del Sistema
- Gestió d'Usuaris i Grups
- sudo i Permisos Especials
- Gestió de Paquets
- Gestió de Discs
- systemd i la Gestió de Serveis
- Registres del Sistema: journald i syslog
- Monitoratge del Sistema i Optimització del Rendiment
- Còpies de Seguretat i Restauració
Mòdul 6: Xarxes i Seguretat
- Configuració de Xarxes
- SSH i Accés Remot
- Tallafocs i Seguretat Perimetral
- Sistemes de Detecció d'Intrusions
- Gestió de Secrets i Certificats TLS
- Assegurant Sistemes Linux
Mòdul 7: Temes Avançats
- El Procés d'Arrencada i la Recuperació del Sistema
- Diagnòstic Avançat: strace, perf i eBPF
- Optimització del Nucli de Linux
- Virtualització amb Linux
- Contenidors de Linux i Docker
- Automatització amb Ansible
- Alta Disponibilitat i Balanceig de Càrrega
