Cosa c'è di nuovo in Awk?
Brian Kernighan discute dello strumento di scripting Awk, dalla sua creazione al lavoro attuale sul supporto Unicode.
Awk è un potente strumento di scripting che semplifica l'elaborazione del testo. Gli script Awk utilizzano una sintassi pattern-action, in cui Awk esegue un'azione per ogni riga in un file che corrisponde a un pattern. Ciò fornisce un linguaggio di scripting flessibile ma potente per gestire il testo. Ad esempio, lo script Awk a una riga /error/ {print $1, $2, $3}
stamperà i primi tre campi delimitati da spazi per ogni riga che contiene la parola error
.
Anche se abbiamo anche la variante GNU di Awk, chiamata Gawk, l'Awk originale rimane in fase di sviluppo. Recentemente, Brian Kernighan ha avviato un progetto per aggiungere il supporto Unicode ad Awk. Ho incontrato Brian per chiedergli delle origini di Awk e del suo recente lavoro di sviluppo su Awk.
Jim Hall: Awk è un ottimo strumento per analizzare ed elaborare il testo. Come è iniziato?
Brian Kernighan: L'influenza più diretta è stata uno strumento che Marc Rochkind ha sviluppato mentre lavorava al sistema Programmer's Workbench presso i Bell Labs. Per quanto ricordo ora, il programma di Marc prese un elenco di espressioni regolari e creò un programma C in grado di leggere un file di input. Ogni volta che il programma trovava una corrispondenza per una delle espressioni regolari, stampava la riga corrispondente. È stato progettato per creare un controllo degli errori da eseguire sui file di registro dai dati delle operazioni telefoniche. Era un'idea davvero carina: Awk è solo una generalizzazione.
Jim: AWK sta per i tre di voi che lo hanno creato: Al Aho, Peter Weinberger e Brian Kernighan. Come avete progettato e creato Awk voi tre?
Brian: Al era interessato alle espressioni regolari e aveva recentemente implementato egrep, che forniva una tecnica di valutazione lazy molto efficiente per una classe di espressioni regolari molto più ampia di quella fornita da grep. Questo ci ha fornito una sintassi e un codice funzionante.
Peter era interessato ai database e, come parte di ciò, aveva un certo interesse per la generazione di report, come il linguaggio RPG fornito da IBM. E stavo cercando di escogitare una sorta di sistema di editing che rendesse possibile gestire stringhe e numeri con più o meno uguale facilità.
Abbiamo esplorato i progetti, ma non per molto tempo. Penso che Al possa aver fornito il paradigma pattern-action di base, ma questo era implicito in una varietà di strumenti esistenti, come grep, l'editor di flusso sed e negli strumenti linguistici YACC e Lex che abbiamo utilizzato per l'implementazione. Naturalmente il linguaggio d'azione doveva essere simile al C.
Jim: Come è stato utilizzato per la prima volta Awk ai Bell Labs? Quando è stato adottato Awk per la prima volta in Unix?
Brian: Awk è stato creato nel 1977, quindi faceva parte della settima edizione di Unix, che credo sia apparso intorno al 1979. Non direi che sia stato adottato, per quanto fosse solo un altro programma incluso perché era lì. Le persone lo hanno capito molto rapidamente e presto abbiamo avuto utenti in tutti i laboratori. Le persone hanno scritto programmi molto più grandi di quanto avessimo mai previsto, anche decine di migliaia di righe, il che è stato sorprendente. Ma per alcuni tipi di applicazioni, la lingua era un buon abbinamento.
Jim: Awk è cambiato nel corso degli anni o l'Awk di oggi è più o meno lo stesso Awk del 1977?
Brian: Nel complesso, è stato abbastanza stabile, ma ci sono state un buon numero di piccole cose, soprattutto per tenere il passo almeno con le parti principali di Gawk. Gli esempi includono cose come funzioni per eseguire la conversione di maiuscole e minuscole, abbreviazioni per alcuni tipi di espressioni regolari o nomi di file speciali come /dev/stderr
. Internamente, c'è stato molto lavoro per sostituire gli array a dimensione fissa con array che crescono. Anche Arnold Robbins, che si occupa della manutenzione di Gawk, è stato incredibilmente utile con Awk, fornendo buoni consigli, test, codice e aiuto con Git.
Jim: Attualmente stai aggiungendo il supporto Unicode ad Awk. Questo è uno di quei progetti che sembra ovvio quando lo senti, perché Unicode è ovunque, ma non tutti i programmi lo supportano ancora. Raccontaci del tuo progetto per aggiungere Unicode ad Awk.
Brian: È da un po' di tempo che Awk gestisce solo input a 8 bit, anche se in tutta onestà precede Unicode di 10 o 20 anni. Gawk, la versione GNU, gestisce correttamente Unicode da un bel po', quindi è bene essere aggiornati e compatibili.
Jim: Quanto è grande il progetto relativo all'aggiunta del supporto Unicode? Ciò ha richiesto molte modifiche al codice sorgente?
Brian: Non le ho contate, ma probabilmente sono 200 o 300 righe, concentrate principalmente nel riconoscimento delle espressioni regolari o nelle varie funzioni integrate che devono operare in caratteri, non in byte, per Ingresso Unicode.
Jim: A che punto sei con l'aggiunta di Unicode ad Awk?
Brian: C'è un ramo del codice su GitHub che è abbastanza aggiornato. È stato testato, ma c'è sempre spazio per ulteriori test.
Una cosa da menzionare: gestisce l'input e l'output UTF-8, ma per i punti di codice Unicode, che non sono la stessa cosa dei grafemi Unicode. Questa distinzione è importante ma tecnicamente molto complicata, almeno per come la intendo io. Per fare un semplice esempio, una lettera con un accento potrebbe essere rappresentata come due punti di codice (lettera e accento) o come un singolo carattere (grafema). Farlo bene, qualunque cosa significhi, è molto difficile.
Jim: In un video di Computerphile, hai menzionato l'aggiunta del supporto per l'analisi dei valori separati da virgole (CSV) in Awk. Come sta andando il progetto?
Brian: Mentre avevo di nuovo le mani sul codice, ho aggiunto il supporto per l'input CSV, poiché è un altro aspetto del linguaggio che è sempre stato goffo. Non ho fatto nulla per l'output CSV, poiché è facile da fare con un paio di brevi funzioni, ma forse dovrebbe essere rivisitato.
Jim: Per quali tipi di cose usi Awk nel tuo lavoro quotidiano?
Brian: Tutto. Praticamente tutto ciò che altera il testo è un bersaglio per Awk. Certamente, il programma Awk che utilizzo di più è semplice per rendere tutte le righe di un documento di testo della stessa lunghezza. Probabilmente l'ho usato 100 volte mentre scrivevo le risposte alle tue domande.
Jim: Qual è la cosa più bella (o più insolita) che hai fatto con Awk?
Brian: Molto tempo fa, ho scritto un programma C++ che convertiva i programmi Awk in C++ che assomigliavano il più possibile ad Awk, facendo cose come sovraccaricare le parentesi per gli array associativi. Non è mai stato utilizzato, ma è stato un esercizio divertente.
Ulteriori letture
- Awk cheat sheet
- Una guida pratica per imparare Awk (eBook)