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 representa el començament de cada línia fins a la coma.
- 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!