Split di una stringa in bash

Direi che ormai è arrivato il momento di un articolo che abbia una certa utilità (e quindi si merita la lettera iniziale maiuscola :))

Normalmente preferisco usare cut o awk per separare i diversi token contenuti in una stringa.

Stamattina devo sostituire alcune regole di accesso su un firewall (iptables), ho bisogno di individuarle con delle regole ad hoc contenute in un array, la prima riga individua le regole e crea una lista con le loro posizioni.

NEWRULE[1]='iptables -R %s -i eth0 -t tcp --dport 443 --jump HTTPS_ENABLED'
NEWRULE[2]='iptables -R %s -i eth2 -t tcp --dport 443 --jump HTTPS_ENABLED'
 RULES_POSITION=`$IPT -vn --line-number -L INPUT | grep 443 | grep -n . | cut -f1 -d\ `
for INPOINT in $RULES_POSITION; do
   INDICE=${INPOINT%:*}
   POSITION=${INPOINT#*:}
   printf "${NEWRULE[INDICE]}" $POSITION
done


tra il codice riportato ci interessano in particolare le righe

   INDICE=${INPOINT%:*}
   POSITION=${INPOINT#*:}

ci aspettiamo in input delle stringhe del tipo formate da due numeri separate dai due punti, ad esempio 1:24.

Nel nostro caso il separatore è il simbolo di due punti

L’espansione si attiva con ${}, all’interno delle parentesi graffe va inserito il nome della variabile da separare in due. %:* prende la parte della variabile che va dall’inizio alla prima occorrenza del separatore (in questo caso :). Una nota. Questo comportamento è detto lazy , se si vuole utilizzare una selezione greedy bisogna usare un doppio simbolo di percentuale.

Cercherò di spiegarmi meglio:

  • La selezione greedy (=avida) va a cercare il separatore più lontano dall’inizio della stringa
  • La selezione lazy (=svogliata) invece si ferma non appena trova il primo separatore utile

Il comportamento è analogo per l’operatore # (## in versione greedy) che invece seleziona a partire dall’ultimo carattere della string.

wordpress blog chart

2,612,300 blogs with 105,854 new posts today 12 March 2008
2,623,276
blogs with 109,640 new posts today 13 March 2008.
2,637,829 blogs with 104,176 new posts today 14 March 2008.
2,660,750 blogs with 107,661 new posts today 17 March 2008.
2,667,100 blogs with 113,745 new posts today 18 March 2008.
2,684,003
blogs with 100,471 new posts today 19 March 2008.
2,685,022 blogs with 113,348 new posts today 20 March 2008.
2,697,454 blogs with 89,174 new posts today 22 March 2008.
2,705,111
blogs with 81,990 new posts today 23 March 2008.
2,713,939 blogs with 92,928 new posts today 24 March 2008.
2,732,138 blogs with 112,904 new posts today 25 March 2008.

Mi è venuta la curiosità di tracciare le statistiche di wordpress. Vorrei costruire, per esercizio, uno script per l’aggiornamento automat(t)ico del post. Vedremo se e quando ne avrò tempo.

Per ora aggiornamento manuale 😉