web-dev-qa-db-fra.com

Compter des enregistrements correspondant à un modèle avec awk

Donc, on m'a dit de faire last > lastloggedin qui crée un fichier qui montre les classes la dernière connexion depuis le dernier redémarrage du système, et maintenant, je suis invité à écrire un script AWK nommé myawk qui compte/détermine le nombre de lignes de lastloggedin contient la chaîne CFS264.

J'ai fait grep -c CFS264 lastloggedin

13
TayshaunS

Pour vous aider, vous pouvez utiliser awk pour rechercher des lignes dans un fichier contenant une chaîne comme suit:

$ awk '/CFS264/ { .... }' lastloggedin

Les bits dans le { .... } Seront les commandes requises pour former le nombre de lignes avec cette chaîne. Pour confirmer que ce qui précède fonctionne, vous pouvez utiliser un print $0 Là-bas pour imprimer simplement ces lignes contenant la chaîne de recherche.

$ awk '/CFS264/ { print $0 }' lastloggedin

En ce qui concerne le comptage, si vous recherchez "Compteur AWK", vous devrez trébucher sur cela SO Q & A intitulé: tilisation de l'AWK pour compter le nombre d'enregistrements . La méthode présentée il suffirait de ce que vous décrivez:

$ awk '/CFS264/ {count++} END{print count}' lastloggedin

Exemple

$ last > lastloggedin

$ awk '/slm/ {count++} END {print count}' lastloggedin 
758

$ grep slm lastloggedin  | wc -l
758

$ grep -c slm lastloggedin
758

Remarque: Vous ne disez pas quel champ CFS264 concerne la sortie last. En supposant que c'est un nom d'utilisateur, vous pouvez également restreindre la commande awk pour rechercher uniquement ce champ, comme si:

$ awk '$1=="CFS264" { print $0 }' lastloggedin
21
slm

L'exemple suivant compte les temps que je suis mentionné sans avoir besoin du fichier lastloggedin:

$ last | awk '$1=="yeti" { ++count } END { print count }' 
106

Si vous insistez dans l'utilisation ou que vous êtes obligé d'utiliser le fichier lastloggedin, vous pouvez le faire de cette façon:

$ last > lastloggedin
$ awk '$1=="yeti" { ++count } END { print count }' lastloggedin
106

Utilisation $1~/some_chars/ Pour que tous les noms d'utilisateur contiennent des caractères donnés ou $1~/^prefix/ Pour correspondre uniquement à des noms commençant par prefix:

$ last | awk '$1~/et/ { ++count } END { print count }'
106
$ last | awk '$1~/^ye/ { ++count } END { print count }'
106

Analyse man awk Pour plus de notes ... ;-)

awk est très enrichissant: vous pouvez faire beaucoup de choses après une très courte période d'apprentissage ...

5
user62916

Dernier peut inclure les connexions des utilisateurs à partir de Redémarrages précédents. En tant que tel, les utilisateurs n'empêcheront que les utilisateurs depuis le dernier redémarrage:

last | awk 'NR==1,$1=="reboot"{if ($1 ~ /cfs264/ ) { count+=1; }}END{ print count; }'

La première partie de la commande AWK spécifie une plage - départ de la première ligne jusqu'à ce que la première colonne soit "redémarrer".

2
DarkHeart