28/08/2010

Zsh Navigator Stat

Présentation

Séparément du coeur de zsh, il existe des modules que l'on peut charger, ici j'ai utilisé le module ncurses qui permet de créer une interface utilisateur, indépendante du terminal.

Zsh Navigator Stat est un simple script permettant de faire des statistiques sur les différents navigateurs qui viennent polluer les logs de votre serveur Web.

Code

#!/usr/bin/env zsh

zmodload zsh/curses

integer y
integer length

title="Zsh Navigator Stat"
length=$COLUMNS/2

init()
{
  zcurses addwin main $(( $LINES - 2 )) $(( $COLUMNS - 2 )) 1 1
  zcurses move main 1 $(( ($COLUMNS - 2 - $#title) / 2 ))
  zcurses string main $title
  y=4
}

clean()
{
  for win ($zcurses_windows); do
    [[ -z ${win:#(main|stdscr)} ]] && continue
    zcurses delwin $win
  done
  zcurses delwin main
  zcurses clear stdscr
}

Exit()
{
  clean
  zcurses end
  exit
}

more()
{
  zcurses move main $(($y+1)) 17
  zcurses refresh main
  zcurses addwin record 1 17 $(($y+2)) 6 main
  zcurses attr record green/red bold
  zcurses string record "- - More - -"
  zcurses refresh record
  while [[ -z $REPLY ]] && [[ -z $key ]]; do
    zcurses input main REPLY key
  done
  case $REPLY in
    (q)
    Exit
    ;;
  esac
  key=
  REPLY=
}

print_stat()
{
  for line in $(awk '!($1 in wtf) {print $12}' access.log | uniq | sort | uniq -c | sort -rn | sed 's/\"/,/' | awk '{print $1$2}'); do
    zcurses move main $y 5
    line=(${(s:,:)line})
    [ ${#line[2]} -le 2 ] && continue
    line[2]=$(echo $line[2] | sed 's/[;\"]/ /' )
    zcurses string main $line[2]
    zcurses move main $y 60
    zcurses string main "[${(r:$length::-:)${(l:$(( $line[1] / 1))::=:)"="}}] ($line[1])"
    y+=1
    if (( $(($y+4)) >= ($LINES) )); then
      more
      clean
      init
    fi
    zcurses refresh main
  done
}

zcurses init
init
print_stat
Exit

Résultat

zsh_stat

Bugs

Afin que le résultat soit un minimum joli la largeur du terminal doit être au minimum de 150 pixels. Pourquoi ? car comme vous pouvez le constater sur l'image ci-dessus quand des b0ts à la #$% viennent scanner votre site, ils ont des noms à rallonge.

17/07/2010

Que zsh soit avec toi

Zsh est un shell Unix qui peut être utilisé de façon interactive, à l'ouverture de la session ou en tant que puissant interpréteur de commande. Je ne suis pas là pour le présenter mais seulement pour montrer une tricks super utile.

Juste à titre d'exemple pour ceux qui connaissent pas, imaginons que votre parton vous appelle et vous demande de modifier dans un répertoire du serveur de dev tous les fichier .html en .htm.

En version POSIX ca donnerait :

for i in *.html; do mv -i $i ${i%.html}.htm; done

Avec zsh :

zmv '(*).html' '$1.htm'

Plus sexy non ?

Bref, la tricks c'était de pouvoir choisir les délimiteurs lorsqu'on fait un meta-backspace, ça peut être super pratique lorsqu'on s'est trompé dans un PATH en ayant choisi "/" comme délimiteur, il suffit pour pour cela d'éditer votre .zshrc et y mettre :

bindkey -e
bindkey "^H" backward-delete-word
WORDCHARS="${WORDCHARS:s#/#}"

Ici le bindkey -e, c'est pour se mettre en mode emacs et notre meta-backspace deletera bien les words délimités par un "/".

Pages : 1