[linux-leman] truc et astuce: filtrer la commande ps

Félix Hauri felix at f-hauri.ch
Thu Apr 17 11:39:26 CEST 2003


Au début je m'énervais à faire ``grep -v grep'' pour reperer une tâche
précise (lorsque ``ps -C'' ne marche pas) :
$ ps ax | grep X\ | grep -v grep | sed -e s/^\ *// -e s/\ .*$//

(lorsque 
$ ps -C X o pid=
 ne marche po;)

Je me d'abord dit: Il y a au moins un grep de trop!
puis: Bon sang, mais c'est bien sûr!

$ ps ax | grep [0-9][^\\\]]*X\ | sed -e s/^\ *// -e s/\ .*$//

Ce grep là refusera les lignes dans lequelles un chiffre sera séparé par
une fermeture de crochet du X majuscule suivit d'un espace, recherché.

Du coup, comme je suis en bash, je peux aussi me passer du sed pour faire
mon ``parsing'' (séparation des notions).

$ set -- $( ps ax | grep [0-9][^\\\]]*X\ )
$ echo $1

ou mieux: (on s'accroche;)
$ set -- $(ps ax o pid=,lstart=,etime=,cmd=|grep [0-9][^\\\]]*X\ )
$ [ "$1" ] && \
    fmt="Identite\t: %s,\nD\351marr\351 \t: %s %s %s %s \340 %s," && \
    fmt="$fmt\nsoit depuis\t: %s\nCommande\t: %s \n" && \
    printf "$fmt" \
        $1 \
        $( export LC_ALL=fr_CH;
           date -d "$(echo ${@:2:5})" +"%a %d %b %Y %T") \
        "$( echo $7 | \
           sed -e \
   s/\\\([0-9][0-9]\\\):\\\([0-9][0-9]\\\)$/\\1mins\ et\ \\2secs./ \
               -e s/:/hres,\ / -e s/-/jours,\ /)" "${*:8:999}"

(Rappel: le ``$'' en début de ligne signifie ``shell usermode''
 par opposition à ``#'' pour ``root shell''.
 A ne pas copier-coller ;-)

Pour générer les accentués, j'utilise ``printf''.
Notez l'absence de guillemets pour la date par opposition au
champ temps écoulé (qui lui est de longueur variable) juste après.

--
 Félix Hauri  -  <felix at f-hauri.ch>  -  http://www.f-hauri.ch






More information about the gull mailing list