martes, 14 de diciembre de 2010

Barajita premiada (#20) - seq con formato

Típico que necesita sacar por consola una secuencia de números, entonces utiliza el comando seq, por ejemplo:
$ seq 1 5 
1
2
3
4
5

O necesita esos números de dos en dos:
$ seq 1 2 5
1
3
5

La cosa se pone interesante cuando requiere formatos, por ejemplo obtener siempre números de dos cifras, entonces puede utilizar:
$ seq -f "%02g" 1 5
01
02
03
04
05

A este punto usted se preguntará, ¿y para qué puede serme útil esto? Pues yo no lo sé, no mentira, esto podría resultar útil para -por ejemplo- filtrar entradas de un log de apache donde cada línea lleva algo como:
192.168.0.1 - - [01/Nov/2010:00:00:33 +0100] "GET ..." 

Si quisiera extraer cada entrada para un día específico podría utilizar un script del tipo:
#!/bin/bash

for day in `seq -f "%02g" 1 31`; do
  count=`egrep -i "\[$day/Nov/[0-9:+ ]+\] \"GET $line" logs/*access.$month.log | grep " 200 " | wc -l`
  echo "$day,$line: $count"
done

¿Y para qué sirvió el seq? para hacer un "for" con valores de dos dígitos y que así tuviera sentido el grep que hacemos dentro del búcle (ver: $day).