Ricerca nel sito web

15 suggerimenti sul comando Sed per le attività di amministrazione del sistema Linux


Ogni amministratore di sistema ha a che fare quotidianamente con file di solo testo. Sapere come visualizzare determinate sezioni, come sostituire le parole e come filtrare il contenuto di tali file sono competenze che devi avere a portata di mano senza dover eseguire una ricerca su Google.

In questo articolo esamineremo sed, il noto editor di stream, e condivideremo 15 suggerimenti per utilizzarlo per raggiungere gli obiettivi menzionati in precedenza, e altro ancora.

Cos'è il Comando Sed?

Il comando 'sed', abbreviazione di stream editor, è uno strumento di manipolazione del testo versatile e potente che opera sui flussi di testo, consentendo agli utenti di eseguire varie operazioni sui dati, come cercare, sostituire, inserire e eliminare. "Sed" utilizza espressioni regolari per definire modelli per la manipolazione del testo e può essere utilizzato per attività di modifica in batch ed elaborazione del testo negli script.

Una delle sue caratteristiche degne di nota è la modifica sul posto, in cui è possibile modificare direttamente i file o creare copie di backup mentre si apportano modifiche. "Sed" è uno strumento essenziale per amministratori di sistema, programmatori e chiunque abbia a che fare con attività di trasformazione del testo e manipolazione dei dati nella riga di comando.

Di seguito sono riportati alcuni comandi "sed" comuni con esempi:

1. Visualizzazione di un intervallo di righe di un file

Strumenti come head e tail ci consentono di visualizzare la parte inferiore o superiore di un file. Cosa succede se dobbiamo visualizzare una sezione nel mezzo? Il seguente one-liner sed restituirà le righe da 5 a 10 da tecmint.txt:

sed -n '5,10p' tecmint.txt

2. Visualizzazione dell'intero file tranne un determinato intervallo

D'altra parte, è possibile che tu voglia stampare l'intero file tranne un certo intervallo. Per escludere le righe da 20 a 35 da tecmint.txt, esegui:

sed '20,35d' myfile.txt

3. Visualizzazione di linee e intervalli non consecutivi

È possibile che tu sia interessato a una serie di linee non consecutive o a più di un intervallo. Visualizziamo le righe 5-7 e 10-13 da tecmint.txt:

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

Come puoi vedere, l'opzione -e ci permette di eseguire una determinata azione (in questo caso, stampare righe) per ciascun intervallo.

4. Sostituzione di parole o stringhe in un file

Per sostituire ogni occorrenza della parola version con story in tecmint.txt, esegui:

sed 's/version/story/g' tecmint.txt

Inoltre, potresti prendere in considerazione l'utilizzo di gi invece di g per ignorare i caratteri maiuscoli:

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

Per sostituire più spazi vuoti con un unico spazio, utilizzeremo l'output del comando ip route show con una pipeline:

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

Confronta l'output di ip route show con e senza la pipeline:

5. Sostituzione di parole o stringhe all'interno di un intervallo

Se desideri sostituire le parole solo all'interno di un intervallo di righe (da 30 a 40, ad esempio), puoi procedere nel seguente modo:

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

Naturalmente è possibile indicare una singola riga tramite il numero corrispondente anziché un intervallo.

6. Rimuovere i commenti da un file

A volte i file di configurazione vengono caricati con commenti. Sebbene ciò sia certamente utile, a volte può essere utile visualizzare solo le direttive di configurazione se si desidera vederle tutte a colpo d'occhio.

Per rimuovere le righe vuote o quelle che iniziano con # dal file di configurazione di Apache, esegui:

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

Il segno di accento circonflesso è seguito dal segno di cancelletto. (^#) indica l'inizio di una riga, mentre ^$ rappresenta righe vuote. Le barre verticali indicano operazioni booleane, mentre la barra rovesciata viene utilizzata per sfuggire alle barre verticali.

In questo caso particolare, il file di configurazione di Apache ha righe con # non all'inizio di alcune righe, quindi *# viene utilizzato per rimuovere anche quelle.

7. Sostituisci una parola senza distinzione tra maiuscole e minuscole in un file

Per sostituire una parola che inizia con maiuscola o minuscola con un'altra parola, possiamo anche usare sed. Per illustrare, sostituiamo la parola zip o Zip con rar in tecmint.txt:

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

8. Trovare eventi specifici in un file di registro

Un altro utilizzo di sed consiste nello stampare le righe di un file che corrispondono ad una determinata espressione regolare. Ad esempio, potremmo essere interessati a visualizzare le attività di autorizzazione e di autenticazione che hanno avuto luogo il 2 luglio, come da /var /log/secure accedi a un server CentOS.

In questo caso, lo schema da cercare è Jul 2 all'inizio di ogni riga:

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

9. Inserimento di spazi o righe vuote in un file

Con sed possiamo anche inserire spazi (righe vuote) per ogni riga non vuota di un file. Per inserire una riga vuota ogni due righe in LICENSE, un file di testo semplice, esegui:

sed G tecmint.txt

Per inserire due righe vuote, eseguire:

sed 'G;G' tecmint.txt

Aggiungi una G maiuscola separata da un punto e virgola se desideri aggiungere più righe vuote. L'immagine seguente illustra l'esempio delineato in questo suggerimento:

Questo suggerimento può tornare utile se desideri ispezionare un file di configurazione di grandi dimensioni. Inserendo uno spazio vuoto ogni due righe e reindirizzando l'output a meno si otterrà un'esperienza di lettura più amichevole.

10. Rimuovere ^M in un file

Il programma dos2unix converte file di testo normale dalla formattazione Windows/Mac a Unix/Linux, rimuovendo i caratteri di nuova riga nascosti inseriti da alcuni editor di testo utilizzati in quelle piattaforme. Se non è installato nel tuo sistema Linux, puoi imitare la sua funzionalità con sed invece di installarlo.

Nell'immagine a sinistra possiamo vedere diversi caratteri di fine riga DOS (^M), che sono stati successivamente rimossi con:

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

Tieni presente che l'opzione -i indica la modifica sul posto. Quindi le modifiche non verranno visualizzate sullo schermo ma verranno salvate nel file.

Nota: puoi inserire caratteri di nuova riga DOS mentre modifichi un file nell'editor Vim con Ctrl+V e Ctrl+M.

11. Crea un file di backup con il comando Sed

Nel suggerimento precedente, abbiamo utilizzato sed per modificare un file ma non abbiamo salvato il file originale. A volte è una buona idea salvare una copia di backup del file originale per ogni evenienza.

Per fare ciò, indicare un suffisso dopo l'opzione -i (tra virgolette singole) da utilizzare per rinominare il file originale.

Nell'esempio seguente, sostituiremo tutte le occorrenze di questo o Questo (ignorando maiuscole e minuscole) con quello in miofile.txt e salveremo il file originale come miofile.txt.orig.

Infine, utilizzeremo l'utilità diff per identificare le differenze tra i due file:

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

12. Scambio di coppie di parole in un file

Supponiamo che tu abbia un file contenente nomi completi nel formato Nome, Cognome. Per elaborare adeguatamente il file, potresti voler cambiare Cognome e Nome.

Possiamo farlo con sed abbastanza facilmente:

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

Nell'immagine sopra possiamo vedere che le parentesi, essendo caratteri speciali, necessitano di escape, così come i numeri 1 e 2.

Questi numeri rappresentano le espressioni regolari evidenziate (che devono apparire tra parentesi):

  • 1 rappresenta l'inizio di ogni riga fino alla virgola.
  • 2 è un segnaposto per tutto ciò che si trova a destra della virgola fino alla fine della riga.

L'output desiderato è indicato nel formato SecondaColonna (Cognome) + virgola + spazio + PrimaColonna (Nome). Sentiti libero di cambiarlo in quello che desideri.

13. Sostituzione delle parole solo se viene trovata una corrispondenza separata

A volte sostituire tutte le occorrenze di una determinata parola, o alcune a caso, non è esattamente ciò di cui abbiamo bisogno. Forse è necessario eseguire la sostituzione se viene trovata una corrispondenza separata.

Ad esempio, potremmo voler sostituire start con stop solo se la parola services si trova nella stessa riga. In quello scenario, ecco cosa accadrà:

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

Nella prima riga, start non verrà sostituito con stop poiché la parola services non appare in quella riga, a differenza della seconda riga.

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

14. Esecuzione di due o più sostituzioni contemporaneamente

Puoi combinare due o più sostituzioni in un unico comando sed. Sostituiamo le parole that e line in myfile.txt con This e verse, rispettivamente.

Nota come ciò può essere fatto utilizzando un normale comando di sostituzione sed seguito da un punto e virgola e un secondo comando di sostituzione:

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

Questo suggerimento è illustrato nella seguente immagine:

15. Combinazione di Sed e altri comandi

Naturalmente sed può essere combinato con altri comandi Linux per creare comandi più potenti. Ad esempio, utilizziamo l'esempio fornito nel TIP #4 ed estraiamo il nostro indirizzo IP dall'output del comando ip route.

Inizieremo stampando solo la riga dove si trova la parola src. Quindi convertiremo più spazi in uno solo. Infine, taglieremo il 9 campo (considerando un unico spazio come separatore di campo), ovvero dove si trova l'indirizzo IP:

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

L'immagine seguente illustra ogni passaggio del comando precedente:

Riepilogo

In questa guida abbiamo condiviso 15 suggerimenti e trucchi sed per aiutarti nelle attività quotidiane di amministrazione del sistema. C'è qualche altro suggerimento che usi regolarmente e vorresti condividere con noi e il resto della community?

Se è così, non esitate a farcelo sapere utilizzando il modulo di commento qui sotto. Anche domande e commenti sono benvenuti: non vediamo l'ora di sentire la tua opinione!