J'utilise le code suivant pour écrire les numéros de process des users en ligne et la date à laquelle ils ont été vérifiés:
w | tail -n +3 | awk ' { "date +%H:%M:%S" | getline tim} {if ($1 != "") { if (usr != $1) {printf("%s\t%d\t%s\n",usr, num, tim); usr = $1; num = 1 } else {num++} } } END{ if ($1 != "") if (num !=0) printf("%s\t%d\t%s\n",usr, num, tim);} ' > test2 echo
J'ai un problème. Après avoir exécuté le script, il me donne une ligne + pour la première parsing, où il me donne un blanc pour usr, 1 pour le nombre de process et la date, après quoi il me donne les users réels et d'autres choses. Peux-tu m'aider à le réparer? Ou existe-t-il déjà une fonction pour cela?
J'ai peut- être mal compris l'intention de votre script, mais ne serait-il pas plus simple de build un tableau contenant les counts pour chaque user? quelque chose comme
w | awk ' BEGIN{"date +%H:%M:%S" | getline tim}; NR > 2 {num[$1]++}; END {for (usr in num) print usr, num[usr], tim} '
ou
w | awk -v tim="$(date +%H:%M:%S)" ' NR > 2 {num[$1]++}; END {for (usr in num) print usr, num[usr], tim} '
Votre problème est que usr
est unitialized, et la première fois à travers la boucle, usr
n'est pas égal $1
, donc vous imprimez la ligne.
Vous pouvez append un bloc BEGIN
au code awk:
BEGIN { usr = blank }
et, puis à l'intérieur de l'intérieur if
, vérifiez cette condition avant d'imprimer:
... { if (usr != $1) { if (usr != blank) { printf("%s\t%d\t%s\n",usr, num, tim); } usr = $1; num = 1 } ...