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

  1. cat i tac: el fitxer sencer de cop
  2. less: el visor de debò
  3. head i tail: els extrems
  4. Seguir un fitxer en directe: tail -f i tail -F
  5. nl i wc: numerar i comptar
  6. Panorama d'editors en terminal
  7. nano complet
  8. vim de supervivència
  9. La lliçó d'or: còpia abans d'editar
  10. Fitxers que no són text: file, strings, xxd i reset
  11. Comparar versions: diff i sdiff

  1. cat i tac: el fitxer sencer de cop

cat (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à;10

El seu nom ve del seu propòsit original, que no era mostrar sinó concatenar:

operador@srv-tramontana:~$ cat dades/cases.txt dades/reserves.csv > /tmp/tot.txt

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:

operador@srv-tramontana:~$ cat -A /tmp/config-luis.conf
port=8080^M$
timeout=30^M$

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

grep 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;6

Sona anecdòtic i és molt útil amb registres, perquè el més recent és al final i tac el posa a dalt.

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

operador@srv-tramontana:~$ sudo less /var/log/tramontana/acces.log

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.

  1. head i tail: els extrems

Gairebé 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.00

Deu 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.00

La 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

  1. Seguir un fitxer en directe: tail -f i tail -F

Aquest é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 s

L'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.log

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

  1. nl i wc: numerar i comptar

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

operador@srv-tramontana:~$ wc dades/reserves.csv
  26  26 1204 dades/reserves.csv

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 total

Un 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
10

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

  1. 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:

  • nano per 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.
  • vim perquè 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 ha vi o vim, perquè POSIX ho exigeix. Entrar en un servidor caigut i no saber sortir de vim é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.

  1. nano complet

operador@srv-tramontana:~$ nano /home/operador/dades/cases.txt

La 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 és Ctrl+O.
  • M- significa Meta, que en un teclat actual és Alt (o Esc premut i deixat anar abans). M-U és Alt+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:

Desar la memòria intermèdia modificada?
 S Sí
 N No           ^C Cancel·lar

Configuració mínima a ~/.nanorc

Quatre línies que milloren molt l'experiència:

operador@srv-tramontana:~$ nano ~/.nanorc
# 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.

operador@srv-tramontana:~$ mkdir -p ~/.nano-backups

  1. vim de supervivència

L'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:

  1. En obrir vim estàs en mode NORMAL. Si escrius, no apareix text: s'executen ordres.
  2. Esc sempre et retorna al mode normal. Si estàs perdut, prem Esc dues vegades i ja ets en terreny conegut.

Entrar i sortir

operador@srv-tramontana:~$ vim /etc/tramontana/app.conf
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 fitxer
  • s — 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:

operador@srv-tramontana:~$ vimtutor

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

  1. 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.conf

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

  1. Fitxers que no són text: file, strings, xxd i reset

Per què no has de fer cat d'un binari

operador@srv-tramontana:~$ cat /opt/tramontana/app/executable

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:

operador@srv-tramontana:~$ reset

Escriu-ho encara que no vegis el que escrius i prem Enter. Si reset no està disponible:

operador@srv-tramontana:~$ stty sane
operador@srv-tramontana:~$ tput reset

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-64

less 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 bf al 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\xbfport en comptes de port, no la reconeix, i fa servir el valor per defecte. És una fallada que pot costar hores si no saps que existeix.
  • 0d 0a al 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.

  1. Comparar versions: diff i sdiff

La 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=200

Aquest 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=info

Com 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 $?
0

Sense 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.html

Els 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=info

Els 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):

  1. Quantes línies té?
  2. Mostra la primera i l'última.
  3. Mostra les línies de la 100 a la 105.
  4. Obre el fitxer amb less, ves al final, cerca cap enrere la primera aparició de 500 i anota la línia. Surt sense tancar la sessió.
  5. 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.

operador@srv-tramontana:~$ cat /tmp/config-luis.conf
port=8080
timeout=30
log_nivell=debug

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:

operador@srv-tramontana:~$ sudo sed -n '100,105p' /var/log/tramontana/acces.log

4. Dins de less:

operador@srv-tramontana:~$ sudo less -N /var/log/tramontana/acces.log
  • G per anar al final.
  • ?500 i Enter per cercar cap enrere (? és la cerca inversa; amb / cercaries cap endavant i des del final no hi trobaries res).
  • N per continuar cap enrere si vols veure més coincidències, n per tornar cap endavant.
  • El número de línia el veus gràcies a -N.
  • q per sortir.
   287 2026-08-18 07:22:41 POST /reserves 500 casa=la-solana

5. Seguiment resistent a la rotació:

operador@srv-tramontana:~$ sudo tail -F /var/log/tramontana/acces.log

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

operador@srv-tramontana:~$ sudo less +F /var/log/tramontana/acces.log

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

Dins 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.conf

Seqüència de tecles:

  1. /max_connexions i Enter — cerca i situa el cursor.
  2. A — inserció al final de la línia.
  3. Esborres 50 amb retrocés i escrius 200.
  4. Esc — tornes a mode normal.
  5. o — obre una línia nova a sota i entra en inserció.
  6. Escrius timeout_consulta=30.
  7. Esc, després :wq i Enter.

Alternativa encara més ràpida per al primer canvi, amb substitució i confirmació:

:%s/max_connexions=50/max_connexions=200/gc

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

Resum 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 terminators

file 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_ni

Què 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.timeou

Ara 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, dos2unix l'arregla amb una ordre. I per comprovar-ho abans de donar res per bo, file fitxer t'ho diu en una línia.

Un consell addicional: és més segur editar els fitxers de configuració directament al servidor amb nano o vim que 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.

  • cat per al que cap a la pantalla, tac per 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 -S i segueix registres en directe amb +F sense renunciar a cercar cap enrere. more està superat.
  • head i tail per als extrems, amb -n +2 per saltar-se capçaleres, i tail -F en comptes de -f sempre que un registre pugui rotar.
  • nl i wc per 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: nano cada dia, vim el just per no quedar-te tancat.
  • nano complet, amb la lectura de la seva barra de dreceres (^ és Ctrl, M- és Alt) i un ~/.nanorc mínim on set nowrap evita trencar configuracions.
  • vim de supervivència: modes, Esc com a sortida d'emergència, :q! com a paracaigudes, dd/yy/p/u, /cercar, :%s/a/b/gc i vimtutor pendent de fer una vegada.
  • La convenció que adoptem a partir d'aquí: cp fitxer fitxer.bak-$(date +%F) abans d'editar, i diff -u després per verificar el canvi.
  • file, strings, xxd per al que no és text, reset per recuperar el terminal, i el costum de comprovar abans d'obrir.
  • diff -u per saber què ha canviat, amb el seu format unificat llegit línia a línia, i sdiff per 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

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