15 consells i trucs útils per a les ordres sed per a les tasques diàries d'administració del sistema Linux


Cada administrador del sistema ha de tractar amb fitxers de text sense format diàriament. Saber com veure determinades seccions, com substituir paraules i com filtrar el contingut d'aquests fitxers són habilitats que cal tenir a mà sense haver de fer una cerca a Google.

En aquest article revisarem sed, el conegut editor de fluxos, i compartirem 15 consells per utilitzar-lo per assolir els objectius esmentats anteriorment i molt més.

1. Visualització d'un rang de línies d'un document

Eines com el cap i la cua ens permeten veure la part inferior o superior d'un fitxer. Què passa si hem de veure una secció al mig? El següent sed one-liner retornarà les línies 5 a 10 de myfile.txt:

# sed -n '5,10p' myfile.txt

2. Visualització del fitxer sencer excepte un interval determinat

D'altra banda, és possible que vulgueu imprimir tot el fitxer excepte un interval determinat. Per excloure les línies 20 a 35 de myfile.txt, feu el següent:

# sed '20,35d' myfile.txt

3. Visualització de línies i rangs no consecutius

És possible que estigueu interessat en un conjunt de línies no consecutives o en més d'un rang. Mostrem les línies 5-7 i 10-13 de myfile.txt:

# sed -n -e '5,7p' -e '10,13p' myfile.txt

Com podeu veure, l'opció -e ens permet executar una acció determinada (en aquest cas, imprimir línies) per a cada rang.

4. Substitució de paraules o caràcters (substitució bàsica)

Per substituir cada instància de la paraula versió per història a myfile.txt, feu:

# sed 's/version/story/g' myfile.txt

A més, potser voldreu considerar l'ús de gi en comptes de g per ignorar majúscules i minúscules:

# sed 's/version/story/gi' myfile.txt

Per substituir diversos espais en blanc per un sol espai, utilitzarem la sortida de ip route show i un pipeline:

# ip route show | sed 's/  */ /g'

Compareu la sortida de ip route show amb i sense el pipeline:

5. Substitució de paraules o caràcters dins d'un rang

Si us interessa substituir paraules només dins d'un rang de línies (de 30 a 40, per exemple), podeu fer el següent:

# sed '30,40 s/version/story/g' myfile.txt

Per descomptat, podeu indicar una única línia a través del seu número corresponent en lloc d'un rang.

6. Utilitzar expressions regulars (substitució avançada) – I

De vegades, els fitxers de configuració es carreguen amb comentaris. Tot i que això és certament útil, pot ser útil mostrar només les directives de configuració de vegades si les voleu veure totes d'un cop d'ull.

Per eliminar les línies buides o les que comencen per # del fitxer de configuració d'Apache, feu:

# sed '/^#\|^$\| *#/d' httpd.conf

El signe de cursor seguit del signe numèric (^#) indica el començament d'una línia, mentre que ^$ representa línies en blanc. Les barres verticals indiquen operacions booleanes, mentre que la barra invertida s'utilitza per escapar de les barres verticals.

En aquest cas particular, el fitxer de configuració d'Apache té línies amb #'s no al començament d'algunes línies, de manera que també s'utilitza *# per eliminar-les.

7. Utilitzar expressions regulars (substitució avançada) – II

Per substituir una paraula que comença amb majúscules o minúscules per una altra paraula, també podem utilitzar sed. Per il·lustrar-ho, substituïm la paraula zip o Zip per rar a myfile.txt:

# sed 's/[Zz]ip/rar/g' myfile.txt

8. Visualització de línies que contenen amb un patró donat

Un altre ús de sed consisteix a imprimir les línies d'un fitxer que coincideixin amb una expressió regular determinada. Per exemple, ens pot interessar veure les activitats d'autorització i autenticació que van tenir lloc el 2 de juliol, segons el registre /var/log/secure d'un servidor CentOS 7.

En aquest cas, el patró a cercar és el 2 de juliol al començament de cada línia:

# sed -n '/^Jul  1/ p' /var/log/secure

9. Inserció d'espais en fitxers

Amb sed, també podem inserir espais (línies en blanc) per a cada línia no buida d'un fitxer. Per inserir una línia en blanc cada altra línia a LICENSE, un fitxer de text sense format, feu:

# sed G myfile.txt

Per inserir dues línies en blanc, feu:

# sed 'G;G' myfile.txt

Afegiu una G majúscula separada per un punt i coma si voleu afegir més línies en blanc. La imatge següent il·lustra l'exemple descrit en aquest consell:

Aquest consell pot ser útil si voleu inspeccionar un fitxer de configuració gran. Inserir un espai en blanc cada altra línia i canalitzar la sortida a menys donarà lloc a una experiència de lectura més amigable.

10. Emulació de dos2unix amb edició en línia

El programa dos2unix converteix fitxers de text sense format de Windows/Mac a Unix/Linux, eliminant els caràcters de nova línia ocults inserits per alguns editors de text utilitzats en aquestes plataformes. Si no està instal·lat al vostre sistema Linux, podeu imitar la seva funcionalitat amb sed en comptes d'instal·lar-lo.

A la imatge de l'esquerra podem veure diversos caràcters de nova línia de DOS (^M), que després es van eliminar amb:

# sed -i 's/\r//' myfile.txt

Tingueu en compte que l'opció -i indica l'edició in situ. Aleshores, els canvis no es tornaran a la pantalla, sinó que es desaran al fitxer.

Nota: Podeu inserir caràcters de nova línia de DOS mentre editeu un fitxer a l'editor vim amb Ctrl+V i Ctrl+M.

11. Edició in situ i còpia de seguretat del fitxer original

Al consell anterior vam utilitzar sed per modificar un fitxer però no vam desar el fitxer original. De vegades és una bona idea desar una còpia de seguretat del fitxer original per si de cas.

Per fer-ho, indiqueu un sufix després de l'opció -i (entre cometes simples) que s'utilitzarà per canviar el nom del fitxer original.

En l'exemple següent, substituirem totes les instàncies d'aquest o d'Això (ignorant majúscules i minúscules) amb la del myfile.txt, i desarem el fitxer original com a myfile.txt.orig.

Finalment, utilitzarem la utilitat diff per identificar les diferències entre ambdós fitxers:

# sed -i'.orig' 's/this/that/gi' myfile.txt

12. Canvi de parelles de paraules

Suposem que teniu un fitxer que conté noms complets en el format Nom, Cognom. Per processar adequadament el fitxer, potser voldreu canviar el Cognom i el Nom.

Ho podem fer amb sed amb força facilitat:

# sed 's/^\(.*\),\(.*\)$/\, /g' names.txt

A la imatge de dalt podem veure que els parèntesis, al ser caràcters especials, s'han d'escapar, igual que els números 1 i 2.

Aquests números representen les expressions regulars destacades (que han d'aparèixer entre parèntesis):

  1. 1 representa el començament de cada línia fins a la coma.
  2. 2 és un marcador de posició per a tot el que hi ha a la dreta de la coma fins al final de la línia.

La sortida desitjada s'indica en el format SegonaColumna (Cognom) + coma + espai + PrimeraColumna (Nom). No dubteu a canviar-lo pel que vulgueu.

13. Substituir paraules només si es troba una coincidència separada

De vegades, substituir totes les instàncies d'una paraula determinada, o unes poques a l'atzar, no és precisament el que necessitem. Potser hem de fer la substitució si es troba una coincidència independent.

Per exemple, potser volem substituir start per stop només si la paraula serveis es troba a la mateixa línia. En aquest escenari, això és el que passarà:

We need to start partying at work,
but let’s remember to start all services first.

A la primera línia, start no es substituirà per stop, ja que la paraula serveis no apareix en aquesta línia, a diferència de la segona línia.

# sed '/services/ s/start/stop/g' msg.txt

14. Realitzar dues o més substitucions alhora

Podeu combinar dues o més substitucions amb una única comanda sed. Substituïm les paraules that i line a myfile.txt per This i verse, respectivament.

Tingueu en compte com això es pot fer utilitzant una ordre ordinària de substitució sed seguida d'un punt i coma i una segona ordre de substitució:

# sed -i 's/that/this/gi;s/line/verse/gi' myfile.txt

Aquest consell s'il·lustra a la imatge següent:

15. Combinar sed i altres ordres

Per descomptat, sed es pot combinar amb altres eines per crear ordres més potents. Per exemple, utilitzem l'exemple donat al CONSELL #4 i extreu la nostra adreça IP de la sortida de l'ordre ip route.

Començarem imprimint només la línia on hi ha la paraula src. Després convertirem diversos espais en un de sol. Finalment, retallarem el 9è camp (considerant un únic espai com a separador de camps), que és on es troba l'adreça IP:

# ip route show | sed -n '/src/p' | sed -e 's/  */ /g' | cut -d' ' -f9

La imatge següent il·lustra cada pas de l'ordre anterior:

Resum

En aquesta guia hem compartit 15 consells i trucs sed per ajudar-vos amb les vostres tasques diàries d'administració del sistema. Hi ha algun altre consell que utilitzeu de manera habitual i que us agradaria compartir amb nosaltres i la resta de la comunitat?

Si és així, no dubteu a fer-nos-ho saber mitjançant el formulari de comentaris a continuació. Les preguntes i comentaris també són benvinguts; esperem rebre notícies vostres!