Un servidor Linux s'administra editant fitxers de text. La configuració d'un servei és text, els registres que produeix són text, l'inventari de reserves de Tramontana és text separat per punt i coma, i fins i tot la informació que el nucli exposa a /proc és text. La filosofia Unix que vas veure al Mòdul 1 —«text pla com a interfície universal»— té aquesta conseqüència molt concreta: la meitat de la feina d'administració consisteix a llegir i modificar fitxers de text.
Aquesta lliçó et dona les dues meitats d'aquesta habilitat. La primera, veure contingut sense obrir res: quina ordre fer servir per a un fitxer de tres línies, quina per a un de dos milions, i quina per a un registre que està creixent ara mateix mentre la Marta et pregunta què està passant. La segona, editar: nano complet, perquè és el que faràs servir cada dia, i el vim mínim imprescindible, perquè el dia que entris en un servidor acabat d'instal·lar o en un contenidor pot ser l'única cosa que hi hagi.
I al mig, una convenció que el curs adoptarà a partir d'aquí i no abandonarà: abans d'editar un fitxer de configuració, se'n fa una còpia.
Contingut
catitac: el fitxer sencer de copless: el visor de debòheaditail: els extrems- Seguir un fitxer en directe:
tail -fitail -F nliwc: numerar i comptar- Panorama d'editors en terminal
nanocompletvimde supervivència- La lliçó d'or: còpia abans d'editar
- Fitxers que no són text:
file,strings,xxdireset - Comparar versions:
diffisdiff
cat i tac: el fitxer sencer de cop
cat i tac: el fitxer sencer de copcat (concatenate) aboca un o més fitxers a la pantalla:
operador@srv-tramontana:~$ cat dades/cases.txt
mas-figueres;Mas Figueres;Girona;6
can-ventos;Can Ventós;Empordà;4
la-solana;La Solana;Pallars;8
cal-ferrer;Cal Ferrer;Berguedà;10El seu nom ve del seu propòsit original, que no era mostrar sinó concatenar:
Opcions útils:
| Opció | Què fa |
|---|---|
-n |
Numera totes les línies |
-b |
Numera només les no buides |
-A |
Mostra els caràcters invisibles ($ fi de línia, ^I tabulador) |
-s |
Comprimeix diverses línies en blanc seguides en una |
-A és una eina de diagnòstic infravalorada:
Aquests ^M són retorns de carro de Windows. El $ marca el fi de línia real. És la mateixa patologia que detectava file amb «CRLF line terminators» a la lliçó 02-03, vista ara caràcter a caràcter. Un servei que llegeix port=8080\r intentarà obrir un port anomenat 8080\r i fallarà amb un missatge que no ajuda gens.
L'«ús inútil de cat»
Existeix una expressió consagrada a la cultura Unix, Useless Use of Cat (UUOC), per a això:
# Ús inútil de cat
cat /var/log/tramontana/errors.log | grep "ERROR"
# Correcte
grep "ERROR" /var/log/tramontana/errors.loggrep sap obrir fitxers. Posar-hi un cat al davant crea un procés extra i una canonada per res. Amb un fitxer petit tant és; amb un de diversos gigabytes, el cat obliga a llegir i transferir tot el contingut per la canonada en comptes de deixar que grep el llegeixi directament.
No és purisme: la raó pràctica és que moltes eines perden funcionalitat quan reben l'entrada per canonada en comptes d'un nom de fitxer. grep amb un fitxer et pot dir el número de línia i el nom del fitxer; a través d'una canonada només veu un flux anònim. I wc -l fitxer imprimeix el nom, mentre que cat fitxer | wc -l no.
Dit això, hi ha un ús legítim: quan de debò concatenes diversos fitxers, o quan construeixes una cadena de manera exploratòria i la claredat t'importa més que el rendiment.
La regla honesta: cat és per a fitxers que caben a la pantalla. Per a un fitxer gran, cat et llança milers de línies i només en veus les últimes vint-i-cinc. Per a això hi ha less.
tac és cat al revés: mostra el fitxer començant per l'última línia.
operador@srv-tramontana:~$ tac dades/cases.txt
cal-ferrer;Cal Ferrer;Berguedà;10
la-solana;La Solana;Pallars;8
can-ventos;Can Ventós;Empordà;4
mas-figueres;Mas Figueres;Girona;6Sona anecdòtic i és molt útil amb registres, perquè el més recent és al final i tac el posa a dalt.
less: el visor de debò
less: el visor de debòless mostra un fitxer pàgina a pàgina, sense carregar-lo sencer a memòria. Això últim és l'important: obre un fitxer de 10 GB instantàniament, perquè només llegeix el que va mostrant.
Les dreceres ja les coneixes de la lliçó 02-02, perquè man fa servir less per sota. Aquí van completes, amb les que només tenen sentit sobre fitxers:
| Tecla | Acció |
|---|---|
Espai / f |
Avançar una pantalla |
b |
Retrocedir una pantalla |
d / u |
Mitja pantalla endavant / enrere |
Fletxes, j / k |
Línia a línia |
g / G |
Principi / final del fitxer |
50g |
Anar a la línia 50 |
/text |
Cercar cap endavant |
?text |
Cercar cap enrere |
n / N |
Coincidència següent / anterior |
&text |
Filtrar: mostrar només les línies que coincideixen |
-N (a dins) |
Activar o desactivar els números de línia |
-S (a dins) |
Activar o desactivar el tall de línies llargues |
m + lletra |
Marcar aquesta posició |
' + lletra |
Tornar a la marca |
F |
Passar a mode seguiment en directe |
v |
Obrir el fitxer a l'editor |
h |
Ajuda |
q |
Sortir |
Opcions de la línia d'ordres que val la pena conèixer:
# Amb números de línia
operador@srv-tramontana:~$ sudo less -N /var/log/tramontana/errors.log
# Sense tallar les línies llargues: es desplacen lateralment amb les fletxes
operador@srv-tramontana:~$ sudo less -S /var/log/tramontana/acces.log
# Obrir directament al final (el més nou d'un registre)
operador@srv-tramontana:~$ sudo less +G /var/log/tramontana/errors.log
# Obrir en mode seguiment en directe
operador@srv-tramontana:~$ sudo less +F /var/log/tramontana/errors.log-S mereix explicació. Per defecte, less parteix les línies llargues perquè hi càpiguen, i una sola línia pot ocupar cinc files de pantalla. En un registre amb línies llargues això fa la lectura impossible. Amb -S cada línia ocupa una fila i la resta queda fora; es veu desplaçant-se amb les fletxes esquerra i dreta. Per a un acces.log amb línies de dos-cents caràcters, -S és la diferència entre poder llegir-lo i no poder.
& és la joia amagada. Dins de less, escriu &ERROR i Enter: la pantalla mostra només les línies que contenen «ERROR», ocultant les altres. És un filtre instantani sense sortir del visor. Es treu amb & i Enter en blanc.
+F converteix less en un tail -f amb superpoders: segueix el fitxer en directe, i amb Ctrl+C surts del mode seguiment i pots cercar i navegar pel que ja s'ha escrit, sense tancar res. Amb F tornes a seguir. És la millor eina que hi ha per observar un registre durant una incidència.
more i per què less el va substituir
more és el paginador original d'Unix. Continua instal·lat per compatibilitat:
more |
less |
|
|---|---|---|
| Avançar | Sí | Sí |
| Retrocedir | No (a la versió original) | Sí |
| Cercar cap enrere | No | Sí |
| Obrir fitxers enormes | Els llegeix sencers | Només el que mostra |
| Sortir abans del final | Sí, amb q |
Sí |
| En acabar | Surt i deixa el text a la pantalla | Neteja i torna a l'indicador |
La limitació de more era brutal: si et passaves una línia, no hi havia marxa enrere. Calia tornar a obrir el fitxer des del principi. less va néixer precisament per arreglar això, i d'aquí el seu nom, un joc amb la dita anglesa «less is more».
Avui no hi ha raó per fer servir more, tret d'una: en un sistema mínim o en mode rescat pot ser que less no estigui instal·lat i more sí. Que sàpigues que existeix.
Un comportament de less que convé conèixer i de vegades desactivar: en sortir, neteja la pantalla i no queda rastre del que has vist. Si prefereixes que el contingut es quedi, existeix l'opció -X. I si vols que no pagini quan el contingut cap en una pantalla, -F (majúscula diferent de la tecla F de dins). La combinació less -FX és la que molts administradors deixen configurada per defecte.
head i tail: els extrems
head i tail: els extremsGairebé mai no necessites el fitxer sencer: necessites el principi o el final.
operador@srv-tramontana:~$ head dades/reserves.csv
id;data;casa;hoste;nits;import
1001;2026-07-03;mas-figueres;Nuria Prat;4;620.00
1002;2026-07-05;can-ventos;Oriol Sala;2;280.00
1003;2026-07-08;la-solana;Marc Aliaga;7;1190.00
1004;2026-07-11;cal-ferrer;Berta Mir;3;540.00
1005;2026-07-14;mas-figueres;Jordi Camps;5;775.00
1006;2026-07-18;can-ventos;Aina Roca;2;280.00
1007;2026-07-21;la-solana;Pau Serra;6;1020.00
1008;2026-07-25;cal-ferrer;Elena Vila;4;720.00
1009;2026-07-29;mas-figueres;Sergi Bosch;3;465.00Deu línies per defecte a totes dues ordres.
| Opció | head |
tail |
|---|---|---|
-n N |
Primeres N línies | Últimes N línies |
-n +N |
— | Des de la línia N fins al final |
-n -N |
Tot menys les últimes N | — |
-c N |
Primers N bytes | Últims N bytes |
-q |
No mostra capçaleres amb diversos fitxers | Igual |
-f |
— | Seguir el fitxer en directe |
operador@srv-tramontana:~$ head -n 1 dades/reserves.csv
id;data;casa;hoste;nits;import
operador@srv-tramontana:~$ tail -n 3 dades/reserves.csv
1023;2026-08-14;can-ventos;Ivan Puig;3;420.00
1024;2026-08-16;la-solana;Clara Font;5;850.00
1025;2026-08-17;cal-ferrer;Roger Mas;2;360.00La forma -n +N de tail és la que es fa servir per saltar-se la capçalera d'un CSV:
operador@srv-tramontana:~$ tail -n +2 dades/reserves.csv | head -n 3
1001;2026-07-03;mas-figueres;Nuria Prat;4;620.00
1002;2026-07-05;can-ventos;Oriol Sala;2;280.00
1003;2026-07-08;la-solana;Marc Aliaga;7;1190.00«Des de la línia 2 fins al final» descarta l'encapçalament. És un patró que faràs servir constantment en processar dades a la lliçó 03-05.
-c treballa amb bytes i és útil per abocar-se a un fitxer desconegut sense bolcar-lo sencer:
operador@srv-tramontana:~$ head -c 100 /opt/tramontana/app/executable | xxd | head -n 3
00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............
00000010: 0300 3e00 0100 0000 6013 0000 0000 0000 ..>.....`.......
00000020: 4000 0000 0000 0000 e8ad 4c00 0000 0000 @.........@L....Amb diversos fitxers, tots dos afegeixen una capçalera amb el nom:
operador@srv-tramontana:~$ head -n 2 dades/cases.txt dades/reserves.csv
==> dades/cases.txt <==
mas-figueres;Mas Figueres;Girona;6
can-ventos;Can Ventós;Empordà;4
==> dades/reserves.csv <==
id;data;casa;hoste;nits;import
1001;2026-07-03;mas-figueres;Nuria Prat;4;620.00
- Seguir un fitxer en directe:
tail -f i tail -F
tail -f i tail -FAquest és l'apartat que més faràs servir a la teva vida professional. Quan alguna cosa falla en producció, el primer que es fa és obrir el registre i mirar-lo mentre es reprodueix el problema.
operador@srv-tramontana:~$ sudo tail -f /var/log/tramontana/errors.log
2026-08-18 11:52:03 WARN connexió lenta a la base de dades (1240 ms)
2026-08-18 11:52:44 ERROR fallada en enviar el correu de confirmació reserva=1024
2026-08-18 11:53:01 INFO reintent programat en 60 sL'ordre no acaba: es queda esperant i va mostrant cada línia nova a mesura que l'aplicació l'escriu. Se'n surt amb Ctrl+C.
La diferència crítica entre -f i -F
Ja la vas anticipar resolent el dubte d'en Luis a la lliçó 02-02. Ara en detall, perquè és una d'aquelles coses que s'aprenen amb una incidència si no s'aprenen abans.
flowchart TD
A["tail -f errors.log"] --> B["Segueix el DESCRIPTOR<br/>del fitxer obert"]
C["tail -F errors.log"] --> D["Segueix el NOM<br/>i reobre si canvia"]
B --> E["logrotate a mitjanit:<br/>errors.log -> errors.log.1<br/>es crea un errors.log nou"]
D --> E
E --> F["-f continua mirant el fitxer<br/>reanomenat: NO MOSTRA RES<br/>i no avisa"]
E --> G["-F detecta el canvi,<br/>reobre i continua mostrant"]
logrotate és el mecanisme que evita que els registres creixin sense fi: cada nit reanomena errors.log a errors.log.1, el comprimeix i crea un errors.log buit. La lliçó 05-06 el cobreix.
Si vas deixar un tail -f executant-se, després de la rotació continua llegint un fitxer que ja ningú no escriu. La pantalla es queda quieta i no hi ha cap missatge que t'avisi. Pots passar-te vint minuts convençut que l'aplicació no està registrant errors quan en realitat els està escrivint en un altre lloc.
operador@srv-tramontana:~$ sudo tail -F /var/log/tramontana/errors.log
tail: '/var/log/tramontana/errors.log' has been replaced; following end of new file
2026-08-19 00:00:12 INFO arrencada del cicle diari-F avisa i es torna a enganxar. Per a registres de producció, -F sempre.
Opcions que l'acompanyen bé:
# Començar mostrant les últimes 50 i seguir
operador@srv-tramontana:~$ sudo tail -F -n 50 /var/log/tramontana/errors.log
# Seguir dos fitxers alhora: tail marca de quin ve cada bloc
operador@srv-tramontana:~$ sudo tail -F /var/log/tramontana/acces.log /var/log/tramontana/errors.log
==> /var/log/tramontana/errors.log <==
2026-08-18 11:52:44 ERROR fallada en enviar el correu de confirmació reserva=1024
==> /var/log/tramontana/acces.log <==
2026-08-18 11:52:45 POST /reserves 500 casa=la-solana
# Acabar automàticament si el procés 4127 mor
operador@srv-tramontana:~$ sudo tail -F --pid=4127 /var/log/tramontana/errors.logAquest segon exemple, seguir el registre d'accés i el d'errors alhora, és exactament com es diagnostica: veus l'error i, just al costat, la petició HTTP que el va provocar.
Alternatives per a quan less +F és millor que tail -F: si mentre mires el registre necessites cercar cap enrere alguna cosa que ja ha passat, tail no t'ho deixa i less +F sí (Ctrl+C, cerques amb /, i F per tornar a seguir). Regla: tail -F per vigilar, less +F per investigar.
nl i wc: numerar i comptar
nl i wc: numerar i comptarnl numera les línies de manera configurable, amb més control que cat -n:
operador@srv-tramontana:~$ nl dades/cases.txt
1 mas-figueres;Mas Figueres;Girona;6
2 can-ventos;Can Ventós;Empordà;4
3 la-solana;La Solana;Pallars;8
4 cal-ferrer;Cal Ferrer;Berguedà;10
operador@srv-tramontana:~$ nl -ba -w 3 -s ': ' dades/cases.txt
1: mas-figueres;Mas Figueres;Girona;6
2: can-ventos;Can Ventós;Empordà;4-ba numera totes les línies (per defecte salta les buides), -w fixa l'amplada i -s el separador. És útil quan vols passar a algú un fragment de configuració amb números de línia per poder referir-t'hi per telèfon.
wc (word count) compta:
Tres números: línies, paraules, bytes. Les opcions trien quin:
| Opció | Compta |
|---|---|
-l |
Línies |
-w |
Paraules |
-c |
Bytes |
-m |
Caràcters (diferent de bytes amb UTF-8) |
-L |
Longitud de la línia més llarga |
operador@srv-tramontana:~$ wc -l dades/reserves.csv
26 dades/reserves.csv
operador@srv-tramontana:~$ sudo wc -l /var/log/tramontana/*.log
412 /var/log/tramontana/acces.log
87 /var/log/tramontana/errors.log
499 totalUn matís de -c enfront de -m que importa amb noms en català i castellà:
operador@srv-tramontana:~$ echo -n "Can Ventós" | wc -c
11
operador@srv-tramontana:~$ echo -n "Can Ventós" | wc -m
10Deu caràcters, onze bytes: la ó ocupa dos bytes en UTF-8. Quan comptis longituds de camps de dades, -m és el que vols.
I un truc pràctic: wc -l sobre un CSV compta també la capçalera. Les reserves reals són 25, no 26.
- Panorama d'editors en terminal
| Editor | Corba | Present per defecte | Potència | Quan fer-lo servir |
|---|---|---|---|---|
| nano | Molt suau | Ubuntu, Debian sí | Mitjana | El teu editor diari. Edició ràpida de configuració |
| vim | Pronunciada | Gairebé universal (vi a POSIX) |
Molt alta | Servidors aliens, contenidors, mode rescat |
| emacs | Molt pronunciada | Poques vegades | Màxima | Si ja el fas servir; no s'aprèn per administrar |
| VS Code per SSH | Suau | No | Alta | Desenvolupament, projectes amb molts fitxers |
ed |
Extrema | Sempre | Baixa | Només si el terminal està tan trencat que no funciona res més |
La decisió raonable per a un administrador de sistemes és aprendre nano bé i vim el just:
nanoper al teu dia a dia. És a Ubuntu, a Debian i a la majoria de les distribucions de servidor. Mostra les dreceres a la pantalla. No té modes. Ningú no ha perdut temps aprenent-lo.vimperquè algun dia no hi haurànano. Contenidors Docker minimalistes, imatges de RHEL sense paquets opcionals, sistemes en mode rescat, servidors de clients amb polítiques restrictives. A tots ells hi haviovim, perquè POSIX ho exigeix. Entrar en un servidor caigut i no saber sortir devimés una situació real i evitable.
Sobre VS Code o editors gràfics per SSH: l'extensió Remote-SSH permet editar fitxers remots amb una interfície gràfica còmoda. És excel·lent per a desenvolupament. Per a administració té tres inconvenients seriosos: instal·la un agent al servidor (que consumeix memòria i pot no estar permès), no funciona en mode rescat ni abans que el sistema arrenqui del tot, i no està disponible quan hi accedeixes des de la consola física o des del mòbil durant una guàrdia. Fes-lo servir per treballar en el codi de l'aplicació; no en depenguis per administrar.
emacs és un entorn extraordinari, però aprendre'l des de zero per editar quatre fitxers de configuració no compensa. Si ja el fas servir, continua.
nano complet
nano completLa pantalla té tres zones: el títol a dalt, el text al mig i dues files de dreceres a baix. Aquestes dues files són la raó per la qual nano no s'oblida.
Llegir la barra de dreceres
^G Ajuda ^O Desar ^W Cercar ^K Retallar M-U Desfer ^X Sortir ^R Llegir fit.^\ Reemplaçar ^U Enganxar M-E Refer
La notació és fixa i cal interioritzar-la:
^significa Ctrl.^OésCtrl+O.M-significa Meta, que en un teclat actual és Alt (oEscpremut i deixat anar abans).M-UésAlt+U.
Amb això, la barra inferior és la documentació completa i sempre visible.
Dreceres per categories
Moviment (a més de les fletxes, que funcionen sempre):
| Drecera | Acció |
|---|---|
Ctrl+A / Ctrl+E |
Principi / final de línia |
Ctrl+Y / Ctrl+V |
Pàgina amunt / avall |
Alt+\ / Alt+/ |
Principi / final del fitxer |
Ctrl+_ |
Anar a un número de línia concret |
Alt+G |
El mateix, en versions recents |
Fixa't que Ctrl+A i Ctrl+E són els mateixos que a la línia d'ordres de Bash. No és casualitat: tots dos segueixen la convenció de readline.
Edició:
| Drecera | Acció |
|---|---|
Ctrl+K |
Retallar la línia actual (o la selecció) |
Ctrl+U |
Enganxar el que has retallat |
Alt+6 |
Copiar sense retallar |
Ctrl+6 o Alt+A |
Marcar l'inici d'una selecció |
Alt+U |
Desfer |
Alt+E |
Refer |
Ctrl+D |
Esborrar el caràcter sota el cursor |
Per retallar diverses línies, Ctrl+K repetit: es van acumulant al porta-retalls i Ctrl+U les enganxa totes juntes.
Cerca i reemplaçament:
| Drecera | Acció |
|---|---|
Ctrl+W |
Cercar |
Alt+W |
Repetir l'última cerca |
Ctrl+\ |
Cercar i reemplaçar |
Ctrl+C |
Mostrar la posició actual (línia i columna) |
El reemplaçament amb Ctrl+\ demana el text a cercar, després el de substitució, i per cada coincidència pregunta: S per substituir aquesta, N per saltar-la, T per a totes de cop.
Fitxer:
| Drecera | Acció |
|---|---|
Ctrl+O |
Desar (demana confirmar el nom; Enter per al mateix) |
Ctrl+R |
Inserir un altre fitxer a la posició del cursor |
Ctrl+X |
Sortir (pregunta si hi ha canvis sense desar) |
Ctrl+T |
Explorador de fitxers en desar |
El flux bàsic complet: obres, edites, Ctrl+O, Enter, Ctrl+X. Cinc pulsacions.
Si intentes sortir amb canvis sense desar, nano pregunta:
Configuració mínima a ~/.nanorc
Quatre línies que milloren molt l'experiència:
# Mostrar números de línia set linenumbers # Ressaltat de sintaxi include "/usr/share/nano/*.nanorc" # No tallar les línies llargues automàticament: CRÍTIC en fitxers de configuració set nowrap # Convertir els tabuladors en espais i fer-ne servir 4 set tabstospaces set tabsize 4 # Mostrar la posició del cursor permanentment set constantshow # Fer còpia de seguretat en desar set backup set backupdir "/home/operador/.nano-backups"
Les dues importants de debò:
set nowrap evita que nano parteixi automàticament les línies llargues en desar. Sense això, editar un fitxer de configuració amb una directiva llarga el pot trencar silenciosament: la línia es parteix en dues, el servei llegeix mitja directiva i falla. És la causa de més d'una estona perduda.
set backup desa una còpia del fitxer original cada vegada que deses. No substitueix la convenció de l'apartat 9, però és una xarxa addicional gratis.
vim de supervivència
vim de supervivènciaL'objectiu aquí no és que dominis vim. És que puguis editar un fitxer i sortir sense destrossar res en una màquina on no hi ha cap altra cosa. Això són uns quinze ordres.
El concepte que ho explica tot: els modes
vim no és un editor on escrius; és un editor on dones ordres, i un d'aquests modes consisteix a escriure text.
flowchart LR
N["MODE NORMAL<br/>(en obrir)<br/>Les tecles són ordres"]
I["MODE INSERCIÓ<br/>Les tecles escriuen text"]
C["MODE ORDRE<br/>Ordres amb :"]
N -->|"i, a, o, I, A, O"| I
I -->|"Esc"| N
N -->|":"| C
C -->|"Enter o Esc"| N
D'aquí surten les dues regles que resolen el 90 % dels destrets:
- En obrir
vimestàs en mode NORMAL. Si escrius, no apareix text: s'executen ordres. Escsempre et retorna al mode normal. Si estàs perdut, premEscdues vegades i ja ets en terreny conegut.
Entrar i sortir
| Ordre | Què fa |
|---|---|
:w |
Desar |
:q |
Sortir (falla si hi ha canvis sense desar) |
:wq o :x |
Desar i sortir |
ZZ |
Desar i sortir (en mode normal, sense :) |
:q! |
Sortir descartant els canvis |
:w nom |
Desar amb un altre nom |
:w !sudo tee % |
Desar com a root un fitxer que has obert sense permisos |
:q! és l'ordre més important d'aquest apartat. Si has entrat a vim per accident, si has teclejat alguna cosa sense voler, si no saps què has fet: Esc, després :q!, després Enter. Surts sense desar i el fitxer queda com estava.
Aquest :w !sudo tee % resol una situació molt freqüent: has obert /etc/tramontana/app.conf sense sudo, has fet tots els canvis i en desar et diu que el fitxer és de només lectura. En comptes de perdre la feina, aquesta ordre l'escriu passant per sudo.
Escriure text
| Tecla | Entra en inserció... |
|---|---|
i |
abans del cursor |
a |
després del cursor |
I |
al principi de la línia |
A |
al final de la línia |
o |
en una línia nova a sota |
O |
en una línia nova a sobre |
A i o són les que més es fan servir editant configuració: afegir al final d'una línia o obrir una línia nova.
Moure's
| Tecla | Moviment |
|---|---|
h j k l |
Esquerra, avall, amunt, dreta (les fletxes també funcionen) |
w / b |
Paraula següent / anterior |
0 / $ |
Principi / final de línia |
gg |
Principi del fitxer |
G |
Final del fitxer |
42G o :42 |
Anar a la línia 42 |
Ctrl+F / Ctrl+B |
Pàgina endavant / enrere |
Editar
| Ordre | Què fa |
|---|---|
x |
Esborrar el caràcter sota el cursor |
dd |
Retallar la línia sencera |
3dd |
Retallar tres línies |
dw |
Esborrar fins al final de la paraula |
yy |
Copiar la línia (yank) |
p |
Enganxar a sota |
P |
Enganxar a sobre |
u |
Desfer |
Ctrl+R |
Refer |
. |
Repetir l'última ordre |
La lògica de vim és que les ordres es componen: d (esborrar) + w (paraula) = dw. 3 + dd = tres línies. Entendre aquesta composició és el que fa la gent addicta a vim, i també el que fa la seva corba costeruda. Per a supervivència, memoritza dd, yy, p i u.
u és el teu paracaigudes. Prement-lo repetidament desfàs tot fins a l'estat inicial.
Cercar i substituir
| Ordre | Què fa |
|---|---|
/text |
Cercar cap endavant |
?text |
Cercar cap enrere |
n / N |
Següent / anterior |
:%s/vell/nou/g |
Substituir a tot el fitxer |
:%s/vell/nou/gc |
Igual, preguntant en cada cas |
:s/vell/nou/g |
Només a la línia actual |
Desglossament de :%s/vell/nou/g, perquè cada part compta:
%— a totes les línies del fitxers— substituir/vell/nou/— què per quèg— global: totes les aparicions de cada línia, no només la primera
La variant amb c al final pregunta abans de cada substitució. Fes-la servir sempre en un fitxer de producció.
vimtutor
vim porta un tutorial interactiu d'uns trenta minuts:
És, sense exagerar, la millor inversió de mitja hora que pots fer en aquest mòdul. No et convertirà en expert, però després de fer-lo una vegada ja no et quedaràs mai atrapat en un servidor.
Una nota sobre vi enfront de vim: vi és l'editor original d'Unix i vim (Vi IMproved) és la seva versió moderna. A Ubuntu, vi sol ser un enllaç a vim. En sistemes minimalistes pots trobar-te vi de debò, amb menys funcions (sense colors, sense u múltiple), però tot el d'aquest apartat funciona igual.
- La lliçó d'or: còpia abans d'editar
Això no és un truc: és una convenció de treball que el curs adopta a partir d'aquí i no abandona.
Abans de modificar qualsevol fitxer de configuració, se'n fa una còpia datada.
operador@srv-tramontana:~$ sudo cp /etc/tramontana/app.conf /etc/tramontana/app.conf.bak-$(date +%F)
operador@srv-tramontana:~$ ls -l /etc/tramontana/
total 8
-rw-r----- 1 root tramontana 512 Aug 18 08:47 app.conf
-rw-r----- 1 root tramontana 512 Aug 18 12:15 app.conf.bak-2026-08-18$(date +%F) és substitució d'ordres: el shell executa date +%F, que retorna 2026-08-18, i posa el resultat a la línia. El mecanisme complet s'explica a la lliçó 03-01; adopta'l ja com a fórmula.
Per què exactament així:
| Element | Raó |
|---|---|
| Al mateix directori | La trobes a l'instant, sense recordar on la vas deixar |
Sufix .bak-DATA |
Saps de quan és sense obrir res |
cp i no mv |
L'original continua al seu lloc i el servei no se n'assabenta |
| La data en format ISO | Ordena cronològicament en llistar amb ls |
| Abans, no després | Després ja no tens l'original |
Si has de fer diversos canvis el mateix dia, afegeix-hi l'hora:
operador@srv-tramontana:~$ sudo cp /etc/tramontana/app.conf /etc/tramontana/app.conf.bak-$(date +%F-%H%M)El procediment complet d'una edició de configuració, que és el que es fa en producció:
# 1. Còpia de seguretat
operador@srv-tramontana:~$ sudo cp /etc/tramontana/app.conf /etc/tramontana/app.conf.bak-$(date +%F)
# 2. Editar
operador@srv-tramontana:~$ sudo nano /etc/tramontana/app.conf
# 3. Veure EXACTAMENT què has canviat
operador@srv-tramontana:~$ sudo diff -u /etc/tramontana/app.conf.bak-2026-08-18 /etc/tramontana/app.conf
# 4. (Si el servei té validador, fer-lo servir abans de recarregar)
# 5. Recarregar el servei i comprovar que arrenca
# 6. Si alguna cosa va malament: tornar enrere en un segon
operador@srv-tramontana:~$ sudo cp /etc/tramontana/app.conf.bak-2026-08-18 /etc/tramontana/app.confEl pas 3 és el que converteix la còpia en alguna cosa més que una assegurança: et permet verificar el teu propi canvi abans d'aplicar-lo. És on entra diff, a l'apartat 11.
Un advertiment sobre on deixar les còpies: en alguns directoris, deixar-hi fitxers solts té efectes secundaris. Un .bak a /etc/sudoers.d/ o a /etc/apt/sources.list.d/ pot ser llegit pel sistema com si fos configuració vàlida. En aquests casos, la còpia va fora del directori, per exemple a /home/operador/backups-config/. Ho veurem quan toquem aquests directoris al Mòdul 5.
- Fitxers que no són text:
file, strings, xxd i reset
file, strings, xxd i resetPer què no has de fer cat d'un binari
El que passa: apareix un doll d'escombraries a la pantalla, sona un xiulet diverses vegades, i el terminal deixa de funcionar bé. Les lletres que escrius surten com a símbols estranys, l'Enter no baixa de línia, l'indicador és il·legible.
L'explicació és concreta i té sentit. Un terminal interpreta certes seqüències de bytes com a ordres de control, no com a text: canviar de color, moure el cursor, i —aquesta és la que causa el problema— canviar el joc de caràcters a mode gràfic. Un fitxer binari conté bytes arbitraris, i entre milions de bytes aleatoris apareixerà tard o d'hora la seqüència que activa aquest mode. A partir d'aquí, el terminal dibuixa símbols de línies en comptes de lletres.
No s'ha trencat res. Només cal restablir l'estat:
Escriu-ho encara que no vegis el que escrius i prem Enter. Si reset no està disponible:
I si no funciona res, tancar la sessió SSH i tornar a entrar sempre ho arregla, perquè el terminal es reinicia.
Prevenció: passa-hi file abans d'obrir un fitxer desconegut. És un segon i evita el problema sencer.
operador@srv-tramontana:~$ file /opt/tramontana/app/executable
/opt/tramontana/app/executable: ELF 64-bit LSB pie executable, x86-64less també protegeix: en detectar que un fitxer és binari avisa amb "fitxer" may be a binary file. See it anyway?.
strings: extreure el text d'un binari
operador@srv-tramontana:~$ strings /opt/tramontana/app/executable | head -n 20
/lib64/ld-linux-x86-64.so.2
libc.so.6
Tramontana Reserves
3.2.1
ERROR: no es pot llegir la configuració a %s
db_host
db_port
db_name
Reserva creada correctament
...strings cerca seqüències de caràcters imprimibles d'almenys quatre bytes. Usos reals:
- Esbrinar la versió d'un binari sense documentació.
- Trobar les rutes que un programa té compilades a dins (aquí veus que llegeix una configuració).
- Veure els missatges d'error que pot emetre, cosa que ajuda a interpretar-ne un que no entens.
- En anàlisi de seguretat, detectar cadenes sospitoses dins d'un binari desconegut.
| Opció | Què fa |
|---|---|
-n N |
Longitud mínima (per defecte 4) |
-t x |
Mostra el desplaçament en hexadecimal |
-a |
Recorre el fitxer sencer, no només les seccions de dades |
xxd: veure els bytes
operador@srv-tramontana:~$ xxd /opt/tramontana/app/executable | head -n 4
00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............
00000010: 0300 3e00 0100 0000 6013 0000 0000 0000 ..>.....`.......
00000020: 4000 0000 0000 0000 e8ad 4c00 0000 0000 @.........@L....
00000030: 0000 0000 4000 3800 0d00 4000 2100 2000 [email protected]...@.!. .Tres columnes: desplaçament en hexadecimal, els bytes en hexadecimal, i la seva representació com a text (els no imprimibles surten com a punt).
Els primers quatre bytes, 7f 45 4c 46, són \x7fELF: el número màgic que identifica un executable de Linux. És exactament el que llegeix file per fer el seu diagnòstic.
On és útil de debò xxd: per veure caràcters invisibles en un fitxer de text que dona problemes.
operador@srv-tramontana:~$ xxd /tmp/config-luis.conf | head -n 2
00000000: efbb bf70 6f72 743d 3830 3830 0d0a 7469 ...port=8080..ti
00000010: 6d65 6f75 743d 3330 0d0a meout=30..Dues patologies a la vista:
ef bb bfal principi és el BOM d'UTF-8, una marca invisible que afegeixen alguns editors de Windows. El programa que llegeix el fitxer veu la primera clau com a\xef\xbb\xbfporten comptes deport, no la reconeix, i fa servir el valor per defecte. És una fallada que pot costar hores si no saps que existeix.0d 0aal final de cada línia és CRLF, els finals de línia de Windows.
Cap de les dues coses no es veu amb cat, i totes dues són evidents amb xxd. Per això és una eina de diagnòstic, no de curiositat.
Vegeu eines complementàries: hexdump -C produeix una sortida gairebé idèntica i està disponible en més sistemes; od -c és el clàssic POSIX.
- Comparar versions:
diff i sdiff
diff i sdiffLa pregunta més freqüent després que alguna cosa deixi de funcionar és «què ha canviat?». diff la respon.
operador@srv-tramontana:~$ sudo diff /etc/tramontana/app.conf.bak-2026-08-18 /etc/tramontana/app.conf
7c7
< max_connexions=50
---
> max_connexions=200Aquest format clàssic és compacte però críptic. El format unificat, -u, és el que es fa servir avui i el que entenen Git i totes les eines modernes:
operador@srv-tramontana:~$ sudo diff -u /etc/tramontana/app.conf.bak-2026-08-18 /etc/tramontana/app.conf
--- /etc/tramontana/app.conf.bak-2026-08-18 2026-08-18 12:15:03.000000000 +0200
+++ /etc/tramontana/app.conf 2026-08-18 12:31:47.000000000 +0200
@@ -4,7 +4,8 @@
db_port=5432
db_name=reserves
-max_connexions=50
+max_connexions=200
+timeout_consulta=30
log_nivell=infoCom es llegeix:
| Element | Significat |
|---|---|
--- |
El fitxer original, amb la seva data |
+++ |
El fitxer nou, amb la seva data |
@@ -4,7 +4,8 @@ |
Tros: des de la línia 4, 7 línies a l'original; des de la 4, 8 al nou |
| Línia amb espai | Context: no ha canviat |
Línia amb - |
Eliminada de l'original |
Línia amb + |
Afegida al nou |
En aquest exemple: s'ha pujat max_connexions de 50 a 200 i s'ha afegit timeout_consulta. Dos canvis, identificats en tres segons.
Opcions útils:
| Opció | Què fa |
|---|---|
-u |
Format unificat. El que has de fer servir |
-r |
Recursiu, per comparar directoris |
-q |
Només diu si difereixen, no en què |
-i |
Ignora majúscules i minúscules |
-w |
Ignora tots els espais en blanc |
-B |
Ignora les línies en blanc |
--color=always |
Acoloreix les diferències |
-y |
Sortida en dues columnes |
-r amb -q és el que vas fer servir per verificar el paquet d'en Luis a la lliçó anterior:
operador@srv-tramontana:~$ diff -rq /opt/tramontana/app /tmp/verificacio/app
operador@srv-tramontana:~$ echo $?
0Sense sortida i codi 0: idèntics. Amb diferències seria:
operador@srv-tramontana:~$ diff -rq /opt/tramontana/app /tmp/verificacio/app
Files /opt/tramontana/app/version.txt and /tmp/verificacio/app/version.txt differ
Only in /opt/tramontana/app: nou.htmlEls codis de sortida de diff són d'aquells que cal consultar al manual, com vas aprendre a la lliçó 02-02:
| Codi | Significat |
|---|---|
| 0 | Els fitxers són idèntics |
| 1 | Són diferents (no és un error) |
| 2 | Hi ha hagut un error real |
sdiff: comparació en dues columnes
operador@srv-tramontana:~$ sudo sdiff -w 100 /etc/tramontana/app.conf.bak-2026-08-18 /etc/tramontana/app.conf
# Configuració Tramontana Reserves # Configuració Tramontana Reserves
db_host=127.0.0.1 db_host=127.0.0.1
db_port=5432 db_port=5432
db_name=reserves db_name=reserves
max_connexions=50 | max_connexions=200
> timeout_consulta=30
log_nivell=info log_nivell=infoEls marcadors del centre:
|— la línia és diferent a totes dues<— només és a l'esquerra>— només és a la dreta- (buit) — idèntica
sdiff és més llegible per revisar visualment i pitjor per enganxar en un informe o aplicar com a pedaç. -w fixa l'amplada total; ajusta-la al teu terminal.
sdiff -o sortida entra a més en un mode interactiu de fusió, línia a línia, útil per reconciliar dues versions d'una configuració a mà.
Eines relacionades que convé conèixer: vimdiff (o vim -d) mostra les diferències amb color dins de vim i permet moure canvis d'un costat a l'altre; comm compara dos fitxers ordenats línia a línia; i cmp compara byte a byte i serveix per a binaris, on diff no aporta res llegible.
Errors Comuns i Consells
Fer cat d'un fitxer enorme. Milers de línies passant i només en veus les últimes. less o tail.
Fer cat d'un binari. Terminal trencat. file primer, i reset si ja és tard.
Fer servir tail -f en un registre que rota. Es queda mut sense avisar. -F sempre en producció.
No saber sortir de vim. Esc, :q!, Enter. I fes vimtutor una vegada.
Editar configuració sense còpia prèvia. L'error més car de la lliçó, i el més fàcil d'evitar.
Deixar que nano talli línies llargues. set nowrap a ~/.nanorc, o una directiva partida en dues trencarà el servei.
Editar amb sudo nano un fitxer i oblidar el sudo. Fas tota la feina i en desar descobreixes que és de només lectura. A vim hi ha rescat (:w !sudo tee %); a nano pots desar a /tmp amb Ctrl+O i moure'l després.
Consell: less +F en comptes de tail -F quan estiguis investigant. Pots aturar-te i cercar cap enrere sense tancar res.
Consell: less -S per a registres amb línies llargues. Canvia del tot la llegibilitat.
Consell: diff -u just després d'editar, sempre. Abans de recarregar el servei, mira el que has fet. Moltes vegades hi descobriràs un canvi accidental.
Consell: aprèn a fer servir & dins de less. Filtrar sense sortir del visor és més ràpid que qualsevol canonada.
Exercicis
Exercici 1: anàlisi d'un registre
Sobre /var/log/tramontana/acces.log a srv-tramontana, i sense fer servir grep (que és del Mòdul 3):
- Quantes línies té?
- Mostra la primera i l'última.
- Mostra les línies de la 100 a la 105.
- Obre el fitxer amb
less, ves al final, cerca cap enrere la primera aparició de500i anota la línia. Surt sense tancar la sessió. - Deixa el fitxer en seguiment en directe de manera que sobrevisqui a una rotació.
Exercici 2: edició segura de la configuració
La Marta ha aprovat pujar el límit de connexions de l'aplicació. Has de canviar max_connexions de 50 a 200 a /etc/tramontana/app.conf i afegir una línia timeout_consulta=30.
Executa el procediment complet d'edició segura, incloent-hi la verificació del canvi, i prepara un resum de dues línies per a la Marta amb exactament el que has modificat. Fes-ho primer amb nano i repeteix-ho amb vim per practicar.
Exercici 3: el fitxer que no funciona
En Luis et passa un /tmp/config-luis.conf que «té la mateixa configuració però l'aplicació no el llegeix bé». L'aplicació retorna valors per defecte en comptes dels del fitxer.
A primera vista sembla correcte. Diagnostica el problema amb les eines d'aquesta lliçó i explica a en Luis per què passa i com evitar-ho en el futur.
Solucions
Solució 1
# 1. Nombre de línies
operador@srv-tramontana:~$ sudo wc -l /var/log/tramontana/acces.log
412 /var/log/tramontana/acces.log
# 2. Primera i última
operador@srv-tramontana:~$ sudo head -n 1 /var/log/tramontana/acces.log
2026-08-18 00:00:14 GET /cases 200 usuari=anon
operador@srv-tramontana:~$ sudo tail -n 1 /var/log/tramontana/acces.log
2026-08-18 09:14:11 GET /cases 200 usuari=anon
# 3. Línies 100 a 105
operador@srv-tramontana:~$ sudo head -n 105 /var/log/tramontana/acces.log | tail -n 6
2026-08-18 03:41:02 GET /reserves 200 usuari=mvidal
2026-08-18 03:41:19 POST /reserves 201 casa=can-ventos
...La combinació head -n 105 | tail -n 6 és el modisme clàssic per extreure un interval: agafa les primeres 105 i d'aquestes queda't amb les 6 últimes. Compte amb el càlcul: per a les línies 100 a 105 són sis línies, no cinc.
Alternativa més neta amb sed, que veuràs a la lliçó 03-05:
4. Dins de less:
Gper anar al final.?500i Enter per cercar cap enrere (?és la cerca inversa; amb/cercaries cap endavant i des del final no hi trobaries res).Nper continuar cap enrere si vols veure més coincidències,nper tornar cap endavant.- El número de línia el veus gràcies a
-N. qper sortir.
5. Seguiment resistent a la rotació:
-F, no -f. Amb -f, quan logrotate reanomeni el fitxer aquesta nit, l'ordre continuarà mirant el fitxer antic i no mostrarà res més, sense cap avís. Amb -F detecta el reemplaçament, l'anuncia i es torna a enganxar amb el fitxer nou.
Si a més vols poder investigar mentre vigiles:
Ctrl+C per pausar i cercar, F per tornar a seguir.
Solució 2
Versió amb nano:
# 1. Còpia de seguretat ABANS de res
operador@srv-tramontana:~$ sudo cp /etc/tramontana/app.conf /etc/tramontana/app.conf.bak-$(date +%F)
operador@srv-tramontana:~$ ls -l /etc/tramontana/
-rw-r----- 1 root tramontana 512 Aug 18 08:47 app.conf
-rw-r----- 1 root tramontana 512 Aug 18 12:15 app.conf.bak-2026-08-18
# 2. Editar
operador@srv-tramontana:~$ sudo nano /etc/tramontana/app.confDins de nano: Ctrl+W, escrius max_connexions, Enter. El cursor va a la línia. Ctrl+K la retalla i escrius la nova, o millor: et situes amb End, esborres el 50 i escrius 200. Després Ctrl+E (final de línia), Enter per a una línia nova, i escrius timeout_consulta=30. Deses amb Ctrl+O, Enter, i surts amb Ctrl+X.
# 3. Verificar exactament què ha canviat
operador@srv-tramontana:~$ sudo diff -u /etc/tramontana/app.conf.bak-2026-08-18 /etc/tramontana/app.conf
--- /etc/tramontana/app.conf.bak-2026-08-18 2026-08-18 12:15:03.000000000 +0200
+++ /etc/tramontana/app.conf 2026-08-18 12:31:47.000000000 +0200
@@ -4,7 +4,8 @@
db_port=5432
db_name=reserves
-max_connexions=50
+max_connexions=200
+timeout_consulta=30
log_nivell=info
# 4. Comprovar que no s'ha trencat el format del fitxer
operador@srv-tramontana:~$ sudo cat -A /etc/tramontana/app.conf | tail -n 5
max_connexions=200$
timeout_consulta=30$
$
log_nivell=info$Aquest cat -A confirma que no hi ha ^M ni línies partides: cada línia acaba netament en $.
Versió amb vim, partint de la còpia restaurada:
operador@srv-tramontana:~$ sudo cp /etc/tramontana/app.conf.bak-2026-08-18 /etc/tramontana/app.conf
operador@srv-tramontana:~$ sudo vim /etc/tramontana/app.confSeqüència de tecles:
/max_connexionsi Enter — cerca i situa el cursor.A— inserció al final de la línia.- Esborres
50amb retrocés i escrius200. Esc— tornes a mode normal.o— obre una línia nova a sota i entra en inserció.- Escrius
timeout_consulta=30. Esc, després:wqi Enter.
Alternativa encara més ràpida per al primer canvi, amb substitució i confirmació:
La c final fa que pregunti abans de substituir. En un fitxer de producció, sempre amb c.
# 3 i 4 igual que abans
operador@srv-tramontana:~$ sudo diff -u /etc/tramontana/app.conf.bak-2026-08-18 /etc/tramontana/app.confResum per a la Marta:
Canvi aplicat a la configuració de Tramontana Reserves (
/etc/tramontana/app.conf) el 18/08/2026 a les 12:31: el límit de connexions simultànies puja de 50 a 200 i s'afegeix un temps màxim d'espera per consulta de 30 segons, perquè una consulta bloquejada no retingui una connexió indefinidament.S'ha desat una còpia de la configuració anterior (
app.conf.bak-2026-08-18), de manera que revertir el canvi és qüestió de segons si detectem qualsevol efecte no desitjat. El canvi requereix recarregar el servei per fer efecte.
Aquest informe té el que la Marta necessita: què ha canviat, quan, per què i com es desfà.
Solució 3
cat no mostra el problema perquè el problema és invisible per definició. Diagnòstic per passos:
# Pas 1: quin tipus de fitxer és realment?
operador@srv-tramontana:~$ file /tmp/config-luis.conf
/tmp/config-luis.conf: Unicode text, UTF-8 (with BOM) text, with CRLF line terminatorsfile ja dona el diagnòstic complet en una línia: BOM d'UTF-8 i terminadors CRLF. Dos problemes, tots dos causats per haver editat el fitxer en un editor de Windows.
# Pas 2: confirmar-ho veient els caràcters de control
operador@srv-tramontana:~$ cat -A /tmp/config-luis.conf
M-oM-;M-?port=8080^M$
timeout=30^M$
log_nivell=debug^M$
# Pas 3: veure-ho byte a byte per no deixar dubtes
operador@srv-tramontana:~$ xxd /tmp/config-luis.conf | head -n 2
00000000: efbb bf70 6f72 743d 3830 3830 0d0a 7469 ...port=8080..ti
00000010: 6d65 6f75 743d 3330 0d0a 6c6f 675f 6e69 meout=30..log_niQuè està passant exactament:
Problema 1: el BOM (ef bb bf). Són tres bytes invisibles al principi del fitxer, una marca que alguns editors de Windows insereixen per assenyalar que el fitxer és UTF-8. L'aplicació, en llegir la primera línia, no veu la clau port, sinó \xef\xbb\xbfport. No la reconeix com a clau vàlida, així que fa servir el valor per defecte i continua com si res. Només afecta la primera línia, cosa que fa la fallada encara més confusa: sembla que unes opcions funcionen i altres no.
Problema 2: CRLF (0d 0a). Cada línia acaba amb retorn de carro més salt de línia, mentre que Unix només fa servir salt de línia. L'aplicació llegeix el valor de timeout com a 30\r, no com a 30. Si espera un número, la conversió falla i cau al valor per defecte. I si el valor fos una ruta, intentaria obrir un fitxer el nom del qual acaba en un caràcter invisible, amb un missatge d'error del tipus No such file or directory: /var/log/app.log en el qual la ruta es veu perfectament correcta.
La solució:
# Còpia abans de tocar, com sempre
operador@srv-tramontana:~$ cp /tmp/config-luis.conf /tmp/config-luis.conf.bak-$(date +%F)
# Instal·lar l'eina específica
operador@srv-tramontana:~$ sudo apt install -y dos2unix
# Convertir: dos2unix elimina el BOM i els CR alhora
operador@srv-tramontana:~$ dos2unix /tmp/config-luis.conf
dos2unix: converting file /tmp/config-luis.conf to Unix format...
# Verificar
operador@srv-tramontana:~$ file /tmp/config-luis.conf
/tmp/config-luis.conf: ASCII text
operador@srv-tramontana:~$ cat -A /tmp/config-luis.conf
port=8080$
timeout=30$
log_nivell=debug$
operador@srv-tramontana:~$ xxd /tmp/config-luis.conf | head -n 1
00000000: 706f 7274 3d38 3038 300a 7469 6d65 6f75 port=8080.timeouAra el fitxer comença directament per port i cada línia acaba en 0a. Comparació final:
operador@srv-tramontana:~$ diff /tmp/config-luis.conf.bak-2026-08-18 /tmp/config-luis.conf
1,3c1,3
< port=8080
---
> port=8080
...diff marca les tres línies com a diferents encara que es vegin idèntiques. Aquesta sortida desconcertant és, per si sola, la signatura d'un problema de caràcters invisibles: si diff diu que dues línies iguals són diferents, la diferència és en bytes que no s'imprimeixen.
Què li expliques a en Luis:
El fitxer és correcte en el seu contingut, però no en la seva codificació. L'has editat a Windows i l'editor hi ha afegit dues coses invisibles: una marca de tres bytes al principi del fitxer (el BOM) i un retorn de carro al final de cada línia. L'aplicació llegeix la primera clau com si tingués tres caràcters estranys al davant i tots els valors amb un caràcter invisible al final, així que no en reconeix cap i aplica els valors per defecte. D'aquí que «sembli» que no llegeix el fitxer.
Perquè no torni a passar: al teu editor de Windows, configura el final de línia com a LF i la codificació com a UTF-8 sense BOM (a VS Code es veu i es canvia a la barra d'estat, a baix a la dreta). Si el fitxer ja ve de Windows,
dos2unixl'arregla amb una ordre. I per comprovar-ho abans de donar res per bo,file fitxert'ho diu en una línia.Un consell addicional: és més segur editar els fitxers de configuració directament al servidor amb
nanoovimque endur-te'ls, editar-los a Windows i tornar-los. Cada viatge d'anada i tornada és una oportunitat perquè s'hi colin aquests caràcters.
Aquest cas és un bon exemple d'un principi general: quan alguna cosa «hauria de funcionar» i no funciona, mira els bytes. Les tres eines d'aquesta lliçó —file, cat -A i xxd— resolen en un minut una classe de problema que pot costar una tarda sencera.
Conclusió
Ja saps llegir i escriure el contingut dels fitxers, que és la matèria primera de l'administració de sistemes.
catper al que cap a la pantalla,tacper invertir-ho, i saps què és l'«ús inútil de cat» i per què importa més enllà del purisme.lessés el visor de debò: obre fitxers enormes a l'instant, cerca amb/, filtra amb&, no talla línies amb-Si segueix registres en directe amb+Fsense renunciar a cercar cap enrere.moreestà superat.headitailper als extrems, amb-n +2per saltar-se capçaleres, itail -Fen comptes de-fsempre que un registre pugui rotar.nliwcper numerar i comptar, amb la distinció entre bytes i caràcters que importa en UTF-8.- Coneixes el panorama d'editors i la decisió raonable:
nanocada dia,vimel just per no quedar-te tancat. nanocomplet, amb la lectura de la seva barra de dreceres (^és Ctrl,M-és Alt) i un~/.nanorcmínim onset nowrapevita trencar configuracions.vimde supervivència: modes,Esccom a sortida d'emergència,:q!com a paracaigudes,dd/yy/p/u,/cercar,:%s/a/b/gcivimtutorpendent de fer una vegada.- La convenció que adoptem a partir d'aquí:
cp fitxer fitxer.bak-$(date +%F)abans d'editar, idiff -udesprés per verificar el canvi. file,strings,xxdper al que no és text,resetper recuperar el terminal, i el costum de comprovar abans d'obrir.diff -uper saber què ha canviat, amb el seu format unificat llegit línia a línia, isdiffper revisar-ho en paral·lel.
Has treballat tot el mòdul amb noms de fitxer donant per fet que cada nom correspon a un fitxer. A la propera lliçó, Enllaços Durs i Simbòlics, aquesta suposició es trenca: veuràs que el nom i el contingut són coses separades, que un mateix fitxer pot tenir diversos noms alhora, i que hi ha fitxers el contingut dels quals és simplement la ruta d'un altre. Entendràs què és un inode, per què el nombre d'enllaços d'un directori mai no és 1, per què /bin apareix amb una fletxa a tree, i dissenyaràs el patró de desplegament amb què Tramontana convertirà una publicació en producció i una marxa enrere en un canvi d'enllaç instantani.
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
