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
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.
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