Conta i record corrispondenti al modello con Awk


12

Quindi mi è stato detto di fare last > lastloggedinche crea un file che mostra l'ultimo accesso alle classi dall'ultimo riavvio del sistema, e ora mi viene chiesto di scrivere uno script Awk che prende il nome myawkche conta / determina quante righe lastloggedincontengono la stringa CFS264.

Ho fatto grep -c CFS264 lastloggedin


Devi usare awk? Altrimenti, potresti semplicemente usare grep -c CFS264 lastloggedin | wc -l.
Axel,

2
@Axel: grep -c (something) (something) | wc -lprodurrà sempre "1".
G-Man dice "Ripristina Monica" il

Risposte:


21

Per iniziare, puoi utilizzare awkper cercare le righe in un file che contengono una stringa in questo modo:

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

I bit in { .... }saranno i comandi richiesti per calcolare il numero di linee con quella stringa. Per confermare che quanto sopra funziona, puoi usare a print $0in per stampare semplicemente quelle linee che contengono la stringa di ricerca.

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

Per quanto riguarda il conteggio, se cerchi "contatore awk" ti imbatterai in questo SO domande e risposte intitolato: usare awk per contare no di record . Il metodo mostrato lì sarebbe sufficiente per quello che descrivi:

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

Esempio

$ last > lastloggedin

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

$ grep slm lastloggedin  | wc -l
758

$ grep -c slm lastloggedin
758

NOTA: non si specifica a quale campo appartiene CFS264 lastnell'output. Supponendo che sia un nome utente, è possibile limitare ulteriormente il awkcomando per cercare solo quel campo in questo modo:

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

scusa, cfs264 fa parte di un nome utente. Grazie ragazzi per aver dedicato del vostro tempo ad aiutarmi a capire questo, stavo diventando piuttosto confuso e frustrato.
TayshaunS

@TayshaunS - np, sei il benvenuto, grazie per la Q e buona fortuna con awk.
slm

5

L'esempio seguente conta le volte che sono menzionato senza bisogno del lastloggedinfile:

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

Se insisti nell'uso o sei costretto a utilizzare il lastloggedinfile, puoi farlo in questo modo:

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

Utilizzare $1~/some_chars/per ottenere tutti i nomi utente contenenti i caratteri specificati o $1~/^prefix/per abbinare solo i nomi che iniziano con prefix:

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


PS:

Cerca man awkaltri suggerimenti ... ;-)

awk è molto gratificante: puoi fare molte cose dopo un brevissimo periodo di apprendimento ...


2

Last can include gli accessi degli utenti da riavvii precedenti. Di conseguenza, i seguenti utenti verranno stampati solo dall'ultimo riavvio:

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

La prima parte del comando awk specifica un intervallo: inizia dalla prima riga fino a quando la prima colonna è "riavvia".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.