  <?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>unix &#8211; paologironi blog</title>
	<atom:link href="https://www.gironi.it/blog/tag/unix-it/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.gironi.it/blog</link>
	<description>Appunti sparsi di (retro) informatica, analisi dei dati, statistica, seo, e cose che cambiano</description>
	<lastBuildDate>Fri, 20 Sep 2024 13:06:15 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<item>
		<title>AWK: un amico per aiutarci con i log files (e non solo)</title>
		<link>https://www.gironi.it/blog/awk-un-amico-per-aiutarci-con-i-log-files-e-non-solo/</link>
					<comments>https://www.gironi.it/blog/awk-un-amico-per-aiutarci-con-i-log-files-e-non-solo/#respond</comments>
		
		<dc:creator><![CDATA[paolo]]></dc:creator>
		<pubDate>Wed, 24 Feb 2016 14:48:28 +0000</pubDate>
				<category><![CDATA[awk]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[riga di comando]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[unix]]></category>
		<guid isPermaLink="false">http://www.gironi.it/blog/?p=445</guid>

					<description><![CDATA[AWK &#8211; Un po&#8217; di storia&#8230; La storia di AWK è lunga, in termini informatici lunghissima. E&#8217; il 1977 quando Alfred Aho, Peter Weinberger e Brian Kerningham (dalle iniziali dei tre il suo nome) presentano questo anomalo linguaggio interpretato, utilissimo per processare files di testo strutturati e generare report. AWK è un più di un &#8230; <a href="https://www.gironi.it/blog/awk-un-amico-per-aiutarci-con-i-log-files-e-non-solo/" class="more-link">Leggi tutto<span class="screen-reader-text"> "AWK: un amico per aiutarci con i log files (e non solo)"</span></a>]]></description>
										<content:encoded><![CDATA[<h3>AWK &#8211; Un po&#8217; di storia&#8230;</h3>
<p>La storia di AWK è lunga, in termini informatici lunghissima. E&#8217; il 1977 quando Alfred Aho, Peter Weinberger e Brian Kerningham (dalle iniziali dei tre il suo nome) presentano questo anomalo linguaggio interpretato, utilissimo per processare files di testo strutturati e generare report.<span id="more-445"></span></p>
<figure id="attachment_450" aria-describedby="caption-attachment-450" style="width: 203px" class="wp-caption alignleft"><img fetchpriority="high" decoding="async" class="wp-image-450 size-medium" src="http://www.gironi.it/blog/wp-content/uploads/2016/02/awk-book-203x300.jpg" alt="awk-book" width="203" height="300" srcset="https://www.gironi.it/blog/wp-content/uploads/2016/02/awk-book-203x300.jpg 203w, https://www.gironi.it/blog/wp-content/uploads/2016/02/awk-book.jpg 337w" sizes="(max-width: 203px) 85vw, 203px" /><figcaption id="caption-attachment-450" class="wp-caption-text">la copertina del libro originale su AWK</figcaption></figure>
<p>AWK è un più di un semplice tool e forse qualcosa meno di un completo linguaggio di programmazione, nel senso moderno del termine (anche se è un completo linguaggio di programmazione). Mostra la sua piacevolezza e potenza come filtro in una <em>pipeline,&nbsp;</em>dove si fa preferire alla criptica sintassi di SED e consente di evitare di scomodare il Perl.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>AWK, nelle sue varianti (la più diffusa è quella a cura della Free Software Foundation, <a href="https://www.gnu.org/software/gawk/" target="_blank" rel="noopener noreferrer">GAWK</a>) è disponibile praticamente per qualsiasi sistema operativo possiate immaginare. Sì, anche il DOS.</p>
<p>Ma cosa rende insieme unico, attraente e insieme così poco conosciuto questo strumento che ha per logo un simpatico pinguino, 14 anni prima di Linux?</p>
<h3>La &#8220;strana&#8221; logica di AWK</h3>
<p>Per spiegarlo inizierò dal concetto di base su cui, a mio avviso, si fonda la corretta comprensione del linguaggio. No, non è un esempio di &#8220;Hello World&#8221;&#8230;</p>
<p>La logica di AWK è semplice, ma potente. Come quasi tutti gli strumenti nati in ambito UNIX, AWK <strong>ragiona in termini di linee di testo</strong>. Processa una linea alla volta applicando delle&nbsp;regole, composte da:</p>
<pre>pattern {azione}</pre>
<p>sia il pattern che l&#8217;azione sono opzionali.<br />
Se manca il pattern, l&#8217;azione viene applicata a tutti i record.<br />
Se a mancare è l&#8217;azione, il record che corrisponde al pattern è scritto sullo standard output (quindi di default sullo schermo).</p>
<p><strong>Quello che AWK fa, in pratica, è leggere il testo una riga alla volta, separarlo in campi definiti da un delimitatore (modificabile), assegnare i valori a delle variabili predefinite ($1,$2,$3&#8230;) e applicare le regole indicate dal programmatore.</strong></p>
<p>AWK può ricevere il testo da processare attraverso una <em>pipe</em>, oppure può presentarsi sotto forma di script, invocabile con awk -f nomescript.awk e processare il file o i files indicato/i.</p>
<h3>Un esempio vale mille parole</h3>
<p>Complicato? Un esempio mostrerà tutta la semplicità del linguaggio.<br />
Immaginiamo di avere un file di testo chiamato amici.txt:</p>
<pre>Aldo, 23
Carlo, 28
Mario, 35
Piero, 17
Stefano, 30
Umberto, 29</pre>
<p>Ok, l&#8217;esempio è senza senso, ma serve solo per illustrare l&#8217;utilizzo di AWK&#8230;</p>
<p>se io passo l&#8217;output di cat amici.txt tramite una pipe ad AWK in questo modo:</p>
<pre>cat amici.txt | awk '/Stefano/ {print $2}'</pre>
<p>oppure processo amici.txt direttamente così:</p>
<pre> awk '/Stefano/ { print $2 }' amici.txt</pre>
<p>il risultato a schermo sarà&#8230; 30</p>
<p>Ricordate? pattern e azione. Se e quando AWK trova &#8220;Stefano&#8221; stampa il secondo campo, cioè il numero 30. La virgola è il delimitatore di default di AWK. Se avessi avuto come delimitatore il punto e virgola avrei potuto scrivere:</p>
<pre>cat amici.txt | awk -F; "/Stefano/&nbsp;{print $2}"</pre>
<p>Giochiamo un po&#8217;&#8230; se avessi scritto:</p>
<pre>cat amici.txt | awk "/Stefano/ {print $2, $1}"</pre>
<p>il risultato sarebbe stato:</p>
<pre>30, Stefano</pre>
<p>iniziate a capire l&#8217;utilità di questo strumento, ad esempio per processare al volo files csv?</p>
<p>un po&#8217; di esempi banalissimi:</p>
<pre>{print $1} stampa il primo campo di ogni linea di un file

 /pippo/   stampa tutte le linee che contengono pippo

lenght($0) &lt; 40&nbsp;stampa tutte le linee che contengono meno di 40 caratteri</pre>
<p>e via dicendo&#8230;</p>
<p>Come dicevo, posso usare AWK in una pipe, ma posso anche scrivere dei veri e propri programmi, di maggiore complessità.</p>
<h3>Uno script AWK è fatto&nbsp;di 3 parti (al massimo&#8230;)</h3>
<p>Un programma AWK consta di tre parti: le assegnazioni e le operazioni per così dire preliminari, tipo l&#8217;assegnazione di variabili globali, che troveranno posto qui:</p>
<pre>BEGIN {
...
}</pre>
<p>(ovviamente questa sezione è del tutto opzionale)</p>
<p>poi seguiranno le istruzioni secondo la logica /pattern/ {azione} che abbiamo già visto.<br />
I pattern possono essere combinati con gli operatori booleani || (OR), &amp;&amp; (AND) e ! (NOT).<br />
Le azioni consistono di uno o più comandi, funzioni o assegnazione di variabili, separate da a capo o da punti e virgola e contenute dentro le parentesi graffe {}.<br />
I comandi possono essere assegnazione di variabili (o array), comandi di stampa, funzioni interne, comandi per controllare il flusso dell&#8217;operazione.</p>
<p>e per finire, anch&#8217;esso opzionale:</p>
<pre>END {
...
}</pre>
<p>dove andrò, ad esempio, a stampare il risultato finale di una mia elaborazione (potrei aver sommato tutti i valori presenti in $2 di tutte le righe in una variabile e dentro END andrò a stampare, alla fine, il valore totale di quella variabile&#8230;).</p>
<p>Se salvo il mio script con un nome, ad esempio pippo.awk, posso eseguirlo con:</p>
<pre>awk -f pippo.awk

</pre>
<p>o più comodamente iniziando il mio script con:</p>
<pre>  #!/usr/bin/awk -f</pre>
<p>e poi rendendolo&nbsp;eseguibile.</p>
<p>Le variabili possono essere assegnate nel modo più semplice possibile:<br />
PIPPO = &#8220;dsajsakdsk&#8221;</p>
<p>Gli arrays possono essere creati con la funzione split:</p>
<pre>split (stringa,array[,separatore])</pre>
<p>&#8230;il resto lo lascio alla vostra fantasia!</p>
<hr>
<h4>In libreria, per approfondire</h4>
<div style="float: left;padding-right:20px"><iframe style="width: 120px; height: 240px;" src="https://rcm-eu.amazon-adsystem.com/e/cm?ref=qf_sp_asin_til&amp;t=consulenzeinf-21&amp;m=amazon&amp;o=29&amp;p=8&amp;l=as1&amp;IS2=1&amp;asins=B004D4Y302&amp;linkId=3900986c421b778594422cadb15bd281&amp;bc1=FFFFFF&amp;lt1=_blank&amp;fc1=333333&amp;lc1=0066C0&amp;bg1=FFFFFF&amp;f=ifr" width="300" height="150" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"><br />
</iframe></div>
<div style="float: left;"><iframe style="width: 120px; height: 240px;" src="https://rcm-eu.amazon-adsystem.com/e/cm?ref=qf_sp_asin_til&amp;t=consulenzeinf-21&amp;m=amazon&amp;o=29&amp;p=8&amp;l=as1&amp;IS2=1&amp;asins=B00U8232XM&amp;linkId=31b83d17e2c197ee14c7b1f549d033ab&amp;bc1=FFFFFF&amp;lt1=_blank&amp;fc1=333333&amp;lc1=0066C0&amp;bg1=FFFFFF&amp;f=ifr" width="300" height="150" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"><br />
</iframe></div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.gironi.it/blog/awk-un-amico-per-aiutarci-con-i-log-files-e-non-solo/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
