  <?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>script &#8211; paologironi blog</title>
	<atom:link href="https://www.gironi.it/blog/tag/script-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>Thu, 11 Jun 2026 07:27:11 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<item>
		<title>Google Analytics da riga di comando: generare un report</title>
		<link>https://www.gironi.it/blog/google-analytics-report-da-riga-di-comando/</link>
					<comments>https://www.gironi.it/blog/google-analytics-report-da-riga-di-comando/#respond</comments>
		
		<dc:creator><![CDATA[paolo]]></dc:creator>
		<pubDate>Sun, 22 Sep 2019 16:36:43 +0000</pubDate>
				<category><![CDATA[analytics]]></category>
		<category><![CDATA[cli]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[script]]></category>
		<guid isPermaLink="false">https://www.gironi.it/blog/?p=1213</guid>

					<description><![CDATA[Per chi lavora prevalentemente da terminale &#8211; penso ad esempio agli amministratori di sistema, a chi preferisce un ambiente senza fronzoli e distrazioni, a chi vuole risparmiare memoria o semplicemente trova più appagante la &#8220;vecchia scuola&#8221; &#8211; può nascere se non l&#8217;esigenza almeno il desiderio di consultare i dati di Google Analytics senza ricorrere al &#8230; <a href="https://www.gironi.it/blog/google-analytics-report-da-riga-di-comando/" class="more-link">Leggi tutto<span class="screen-reader-text"> "Google Analytics da riga di comando: generare un report"</span></a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Per chi lavora prevalentemente da terminale &#8211; penso ad esempio agli amministratori di sistema, a chi preferisce un ambiente senza fronzoli e distrazioni, a chi vuole risparmiare memoria o semplicemente trova più appagante la &#8220;vecchia scuola&#8221; &#8211; può nascere se non l&#8217;esigenza almeno il desiderio di <strong>consultare i dati di Google Analytics senza ricorrere al browser</strong>.</p>



<p class="wp-block-paragraph">Personalmente, trovo utile avere nella mia scatola degli attrezzi informatici uno script che mi consenta di avere i dati salienti di Analytics, quelli per me utili da monitorare quotidianamente, in breve tempo.</p>



<p class="wp-block-paragraph">La procedura per realizzare l&#8217;obiettivo tramite python e l&#8217;API Google Analytics non è delle più immediate&#8230; però vale bene la mezz&#8217;oretta di tempo necessaria per la messa in opera.</p>



<span id="more-1213"></span>



<p class="wp-block-paragraph">Occorre procedere per passaggi. In primo luogo ho installato i moduli python necessari via pip:</p>



<h2 class="wp-block-heading">Installo i moduli python</h2>



<pre class="wp-block-preformatted">pip install --upgrade google-api-python-client
pip install --upgrade oauth2client</pre>



<p class="wp-block-paragraph">Ho seguito i passaggi indicati da Google per la creazione di un&#8217;utenza di servizio nelle API.</p>



<h2 class="wp-block-heading">Creo il progetto</h2>



<p class="wp-block-paragraph">Per creare il progetto si parte da qua:</p>



<pre class="wp-block-preformatted"><a rel="noreferrer noopener" aria-label=" (apre in una nuova scheda)" href="https://console.developers.google.com/flows/enableapi?apiid=analyticsreporting.googleapis.com&amp;credential=client_key" target="_blank">https://console.developers.google.com/flows/enableapi?apiid=analyticsreporting.googleapis.com&amp;credential=client_key</a></pre>



<p class="wp-block-paragraph">Nella piattaforma di sviluppo Google ho creato un progetto (io l&#8217;ho chiamato &#8220;analytics&#8221;, che fantasia&#8230;).</p>



<h2 class="wp-block-heading">Creo il service account</h2>



<p class="wp-block-paragraph">A questo punto, ho creato il service account scegliendo quel progetto:</p>



<pre class="wp-block-preformatted"><a href="https://console.cloud.google.com/iam-admin/serviceaccounts" target="_blank" rel="noreferrer noopener" aria-label=" (apre in una nuova scheda)">https://console.cloud.google.com/iam-admin/serviceaccounts</a></pre>



<p class="wp-block-paragraph">Ho creato la chiave. Ho generato e scaricato il file json nella cartella dove ho salvato il mio script, rinominandolo <strong>google_secrets.json</strong></p>



<p class="wp-block-paragraph">Ho associato al mio account Analytics la casella email generata da Google come utente con poteri di analisi e visualizzazione. (Dalle <em>impostazioni, account, utenti</em>).</p>



<p class="wp-block-paragraph">La parte più noiosa è terminata, e per fortuna non dovrò più ripeterla. Ora viene la parte migliore.</p>



<h2 class="wp-block-heading">Finalmente&#8230;lo script di esempio</h2>



<p class="wp-block-paragraph">Ho scaricato il file d&#8217;esempio <a rel="noreferrer noopener" aria-label="HelloAnalytics.py (apre in una nuova scheda)" href="https://developers.google.com/analytics/resources/samples/service-py-v4.txt" target="_blank">HelloAnalytics.py</a> inserendo il percorso del file JSON e l&#8217;id della vista da interrogare. </p>



<p class="wp-block-paragraph">Le variabili da valorizzare sono:</p>



<pre class="wp-block-preformatted">KEY_FILE_LOCATION = ''
</pre>



<p class="wp-block-paragraph">dove ho indicato il mio file google_secrets.json. E<br></p>



<pre class="wp-block-preformatted">VIEW_ID = ''</pre>



<p class="wp-block-paragraph">dove andrò a scrivere l&#8217;id della vista Analytics. <br>Per trovare l&#8217;id della <strong>vista </strong>ho usato Account Explorer: </p>



<pre class="wp-block-preformatted"><a rel="noreferrer noopener" aria-label=" (apre in una nuova scheda)" href="https://ga-dev-tools.appspot.com/account-explorer/" target="_blank">https://ga-dev-tools.appspot.com/account-explorer/ </a></pre>



<p class="wp-block-paragraph">oppure basta guardare in Analytics.</p>



<p class="wp-block-paragraph">Poi ho lanciato </p>



<pre class="wp-block-preformatted">python HelloAnalytics.py</pre>



<p class="wp-block-paragraph">Tutto ok, lo script restituisce il risultato atteso, cioè i dati degli ultimi 7 giorni delle sessioni per paese. </p>



<p class="wp-block-paragraph">Ora non resta che modificare lo script a proprio piacimento, giocando con date, dimensioni e metriche al fine di ottenere in output ciò che più serve. E qui, l&#8217;unico limite diventa la fantasia.</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.gironi.it/blog/google-analytics-report-da-riga-di-comando/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<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[linux]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[awk]]></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>
<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>
<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>
