Compter les enregistrements correspondant au modèle avec Awk

12

On m'a donc dit de faire last > lastloggedince qui crée un fichier qui montre la dernière connexion des classes depuis le dernier redémarrage du système, et maintenant on me demande d'écrire un script Awk qui est nommé myawkqui compte / détermine combien de lignes lastloggedincontiennent la chaîne CFS264.

J'ai fait grep -c CFS264 lastloggedin

TayshaunS
la source
Devez-vous utiliser awk? Sinon, vous pouvez simplement utiliser grep -c CFS264 lastloggedin | wc -l.
Axel
2
@Axel: grep -c (something) (something) | wc -lproduira toujours "1".
G-Man dit `` Réintègre Monica ''

Réponses:

21

Pour commencer, vous pouvez utiliser awkpour rechercher des lignes dans un fichier contenant une chaîne comme ceci:

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

Les bits de { .... }seront les commandes nécessaires pour comptabiliser le nombre de lignes avec cette chaîne. Pour confirmer que ce qui précède fonctionne, vous pouvez utiliser un print $0dedans pour simplement imprimer les lignes qui contiennent la chaîne de recherche.

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

En ce qui concerne le comptage, si vous recherchez "compteur awk", vous tomberez sur ce SO Q&A intitulé: en utilisant awk pour ne compter aucun enregistrement . La méthode présentée ici suffirait pour 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 dites pas à quel champ CFS264 se rapporte dans la lastsortie. En supposant que c'est un nom d'utilisateur, vous pouvez restreindre davantage la awkcommande pour rechercher uniquement ce champ comme ceci:

$ awk '$1=="CFS264" { print $0 }' lastloggedin
slm
la source
désolé, cfs264 fait partie d'un nom d'utilisateur. Merci les gars d'avoir pris votre temps pour m'aider à comprendre cela, je devenais assez confus et frustré.
TayshaunS
@TayshaunS - np, vous êtes les bienvenus, merci pour le Q et bonne chance avec awk.
slm
5

L'exemple suivant compte les fois où je suis mentionné sans avoir besoin du lastloggedinfichier:

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

Si vous insistez pour utiliser ou êtes obligé d'utiliser le lastloggedinfichier, vous pouvez le faire de cette façon:

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

Utilisez $1~/some_chars/pour obtenir tous les noms d'utilisateurs contenant les caractères donnés ou $1~/^prefix/pour faire correspondre uniquement les noms commençant par prefix:

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


PS:

Scannez man awkpour plus d'indices ... ;-)

awk est très enrichissant: vous pouvez faire beaucoup de choses après un très court apprentissage ...


la source
2

Le dernier peut inclure les connexions des utilisateurs lors des redémarrages précédents. En tant que tel, les éléments suivants n'imprimeront 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 - commencez à partir de la première ligne jusqu'à ce que la première colonne soit 'reboot'.

Cœur sombre
la source