Ogni geek di Linux ha bisogno di conoscere Sed e Awk. Ecco perché…

Due delle utilities Linux criminalmente meno apprezzate sono il seducente arcano Sed e Awk. Ma cosa sono? Come vengono utilizzati? E come rendono più semplice l'elaborazione del testo?

Due delle utilities Linux criminalmente meno apprezzate sono il seducente arcano Sed e Awk.  Ma cosa sono?  Come vengono utilizzati?  E come rendono più semplice l'elaborazione del testo?
Annuncio pubblicitario

Due delle utility Linux meno apprezzate sotto il profilo criminale sono Sed e Awk. Anche se, ammettiamolo, possono sembrare un po 'arcani, se dovessi mai dover apportare modifiche ripetitive a grandi pezzi di codice o testo, o se dovessi mai analizzare un testo, Sed e Awk sono inestimabili.

Quindi, cosa sono? Come vengono utilizzati? E come, combinati insieme, rendono più semplice l'elaborazione del testo?

Cos'è Sed?

Sed è stato sviluppato nel 1971 da Bell Labs, dal leggendario pioniere dell'informatica Lee E. McMahon.

Il nome sta per editor di stream, e questo è un po 'quello che fa. Permette di modificare corpi o flussi di testo a livello di programmazione, attraverso un linguaggio di programmazione compatto e semplice, ma con funzionalità complete.

Il modo in cui funziona è semplice: legge il testo, riga per riga in un buffer. Per ogni riga, eseguirà le istruzioni predefinite, ove applicabile.

Per esempio, se qualcuno scrivesse una sceneggiatura di Sed che sostituisse la parola "birra" con "soda", e poi passasse in un file di testo che conteneva l'intero testo di "99 bottiglie di birra sul muro", sarebbe andato attraverso quel file su base riga per riga, e stampa "99 Bottiglie di Soda sul Muro", e così via.

La sceneggiatura di base di Sed è una Hello World. Qui, usiamo l'utility Unix Echo, che emette semplicemente stringhe, per stampare "Hello World". Ma lo colleghiamo a Sed, e diciamo di sostituire "Mondo" con "Dave". Roba auto-esplicativa.

 echo "Hello World" | sed s / world / Dave 

sedawk-dave

È anche possibile combinare le istruzioni di Sed in file, se è necessario apportare modifiche più complicate. Ispirato da questo esilarante thread Reddit, prenderò i testi di Take On Me di A-Ha e sostituirò ogni istanza di "I", "Me" e "My", con Greg.

Innanzitutto, inserirò i testi nella canzone in un file di testo chiamato tom.txt . Quindi aprirò il mio editor di testo preferito (il mio preferito è Vim I 7 principali motivi per dare a Vim Text Editor un'occasione I 7 principali motivi per dare a Vim Text Editor un'occasione Per anni ho provato un editor di testo dopo un altro, l'hai nominato, l'ho provato, ho usato ciascuno di questi editor per oltre due mesi come il mio principale editor quotidiano ... In qualche modo, io ... Read More, ma Nano nano vs. vim: Terminal Editor di testo Confronto tra nano e vim: Terminali Editor di testo a confronto Sebbene Linux sia diventato abbastanza facile da essere usato praticamente da chiunque senza dover utilizzare il terminale, alcuni di noi lo usano regolarmente o sono curiosi di sapere come controllarlo. Ulteriori informazioni e Gedit gedit: uno degli editor di testo normale pieni di funzionalità [Linux e Windows] gedit: uno degli editor di testo normale pieni di funzionalità [Linux e Windows] Quando si pensa a editor di testo semplice, la prima cosa quello che potrebbe esserci nella tua testa è l'applicazione Blocco note di Windows. Fa esattamente quello che dice la descrizione del suo lavoro - Funzioni semplici per un testo semplice ... Ulteriori informazioni sono entrambe scelte eccellenti) e aggiungi le seguenti righe. Assicurati che il file che crei termini con .sed.

sed-greg-sed

Potresti notare che nell'esempio sopra, mi sono ripetuto (ad es. S / me / Greg / e s / Me / Greg /). Questo perché alcune versioni di Sed, come quella fornita con Mac OS X, non supportano la corrispondenza senza distinzione tra maiuscole e minuscole. Di conseguenza, dobbiamo scrivere due istruzioni Sed per ogni parola, in modo che riconosca la versione maiuscola e maiuscola.

Ciò non funzionerà perfettamente, come se avessi sostituito ogni istanza di "I", "Me" e "My" a mano. Ricorda, lo stiamo solo utilizzando come esercizio per dimostrare come è possibile raggruppare le istruzioni di Sed in uno script e quindi eseguirle con un singolo comando.

Quindi, dobbiamo richiamare il file. Per farlo, eseguiamo questo comando.

 cat tom.txt | sed -f greg.sed 

Rallentiamoci e guardiamo cosa fa. I lettori con gli occhi aquilani avranno notato che non stiamo usando Echo qui. Stiamo usando Cat. Questo perché mentre Cat stamperà l'intero contenuto del file, echo stamperà solo il nome del file. Avrai anche notato che stiamo usando Sed con la bandiera "-f". Questo gli dice di aprire lo script come un file.

Il risultato finale è questo.

sed-greg-script

Vale anche la pena notare che Sed supporta le espressioni regolari (REGEX). Questi ti permettono di definire pattern nel testo, usando una sintassi speciale e complicata.

Ecco un esempio di come potrebbe funzionare. Prenderemo i suddetti testi delle canzoni, ma usiamo espressioni regolari per stampare ogni riga che non inizia con "Take".

 cat tom.txt | sed / ^ Take / d 

sed-regex-take

Sed è, ovviamente, incredibilmente utile. Ma è ancora più potente se combinato con Awk.

Che cosa è Awk?

Awk, come Sed, è un linguaggio di programmazione progettato per gestire grandi volumi di testo. Ma mentre Sed è usato per elaborare e modificare il testo, Awk è principalmente usato come strumento per l' analisi e il reporting .

Come Sed, Awk fu sviluppato nei Bell Labs negli anni '70. Il suo nome non deriva da ciò che fa il programma, ma piuttosto dai cognomi di ciascuno degli autori: Alfred Aho, Peter Weinberger e Brian Kernaghan.

Awk funziona leggendo un file di testo o immettendo in streaming una riga alla volta. Ogni linea viene scansionata per vedere se corrisponde a un modello predefinito. Se viene trovata una corrispondenza, viene eseguita un'azione.

Ma mentre Sed e Awk possono condividere scopi simili, sono due lingue completamente diverse, con due filosofie di design completamente diverse. Awk assomiglia più strettamente ad alcuni linguaggi di uso generale Come scegliere un linguaggio di programmazione per imparare oggi e ottenere un ottimo lavoro in 2 anni Come scegliere un linguaggio di programmazione per imparare oggi e ottenere un ottimo lavoro in 2 anni Ci possono volere anni di lavoro dedicato per diventare un vero programmatore; quindi c'è un modo per scegliere la lingua giusta per iniziare da oggi, per essere assunto domani? Leggi di più, come C, Python e Bash. Ha cose come le funzioni e un approccio più simile a C a cose come iterazione e variabili (James Bruce ha spiegato come funziona l'iterazione Le basi assolute della programmazione per principianti (parte 2) Le basi assolute della programmazione per principianti (parte 2) In parte 2 della nostra guida assoluta ai principianti per la programmazione, parlerò delle basi delle funzioni, dei valori di ritorno, dei loop e dei condizionali. Assicurati di aver letto la parte 1 prima di affrontare questo, dove ho spiegato il ... Read More). In parole povere, sembra più un linguaggio di programmazione.

Quindi proviamolo. Usando il testo di Take On Me, stamperemo tutte le righe che superano i 20 caratteri.

 awk 'length ($ 0)> 80' tom.txt awk lunghezza

Il prossimo esempio che ho spudoratamente criptato dalla documentazione ufficiale di Awk. Ma è un grande esempio del potenziale di questo linguaggio potente ma minuscolo. È anche una grande dimostrazione di come funzionano le cose come l'iterazione e le variabili. Innanzitutto, crea un file chiamato "WordCount.awk" e aggiungi le seguenti linee.

 {for (i = 1; i <= NF; i ++) freq [$ i] ++} 
 END {per (word in freq) printf "% s \ t% d \ n", word, freq [word]} 

Salvalo, quindi eseguilo con il seguente comando.

 awk -f WordCount.awk tom.txt 

awk-wordcount
Fantastico, giusto? Probabilmente noterai che non sono in alcun tipo di ordine. È possibile ordinare i risultati utilizzando l'utilità di ordinamento Unix. Ma lo lasceremo per un altro giorno. Lo manterremo semplice.

Combinare i due

Awk e Sed sono entrambi incredibilmente potenti quando combinati. Puoi farlo usando pipe Unix. Questi sono i bit "|" tra i comandi.

Proviamo questo: elencheremo tutte le linee in Take On Me che hanno più di 20 caratteri, usando Awk. Quindi, elimineremo tutte le righe che iniziano con "Take" . Insieme, sembra tutto questo:

 awk 'length ($ 0)> 20' tom.txt | sed / ^ Take / d 

E produce questo:

awk-lunghezza-sed

Ora giriamo intorno. Inizieremo rimuovendo tutte le linee che iniziano con Take e poi le canalizziamo su Awk, dove conteremo quante volte ogni parola appare. Sembra un po 'come questo:

 cat tom.txt | sed / ^ Take / d | awk -f WordCount.awk 

awk-wordcount-sed

Il potere di Sed e Awk

C'è solo così tanto che puoi spiegare in un singolo articolo. Ma spero di aver illustrato quanto siano straordinariamente potenti Sed e Awk. In poche parole, sono una centrale elettrica per l'elaborazione di testi.

Quindi, perché dovrebbe interessarti? Bene, oltre al fatto che non si sa mai quando è necessario apportare modifiche prevedibili e ripetitive a un documento di testo, Sed e Awk sono ottimi per l'analisi dei file di registro. Ciò è particolarmente utile quando stai cercando di eseguire il debug di un problema nel tuo server LAMP Firmato per il Web Hosting solo SSH? Non preoccuparti - Installa facilmente qualsiasi software Web firmato per l'hosting Web SSH-only? Non preoccuparti: installa facilmente qualsiasi software Web. Non conosci la prima cosa che riguarda l'utilizzo di Linux attraverso la sua potente linea di comando? Non preoccuparti più. Leggi altro, o guarda i tuoi log di accesso per vedere se il tuo server è stato violato.

Hai trovato un uso interessante per Sed e Awk? Ci sono altre utilità di Linux che ritieni siano poco apprezzate? Fatemi sapere nei commenti qui sotto, e faremo chat.

In this article