Contar registros que coinciden con el patrón Awk

12

Entonces, me dijeron que hiciera lo last > lastloggedinque crea un archivo que muestra el último inicio de sesión de las clases desde el último reinicio del sistema, y ​​ahora me piden que escriba un script Awk que se llama myawkque cuenta / determina cuántas líneas lastloggedincontienen la cadena CFS264.

hice grep -c CFS264 lastloggedin

TayshaunS
fuente
¿Tienes que usar awk? Si no, simplemente podrías usarlo grep -c CFS264 lastloggedin | wc -l.
Axel
2
@Axel: grep -c (something) (something) | wc -lserá siempre la producción de "1".
G-Man dice 'reinstalar a Monica' el

Respuestas:

21

Para comenzar, puede usar awkpara buscar líneas en un archivo que contenga una cadena como esta:

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

Los bits en el { .... }serán los comandos necesarios para contar el número de líneas con esa cadena. Para confirmar que lo anterior está funcionando, puede usar un print $0allí para simplemente imprimir las líneas que contienen la cadena de búsqueda.

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

En cuanto al conteo, si busca "contador awk", se encontrará con este SO Q&A titulado: usar awk para contar el número de registros . El método que se muestra allí sería suficiente para lo que describe:

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

Ejemplo

$ last > lastloggedin

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

$ grep slm lastloggedin  | wc -l
758

$ grep -c slm lastloggedin
758

NOTA: No dice a qué campo pertenece CFS264 en la lastsalida. Suponiendo que es un nombre de usuario, puede restringir aún más el awkcomando para buscar solo ese campo de la siguiente manera:

$ awk '$1=="CFS264" { print $0 }' lastloggedin
slm
fuente
lo siento, cfs264 es parte de un nombre de usuario. Gracias a todos por tomarse su tiempo para ayudarme a resolver esto, me estaba confundiendo y frustrando bastante.
TayshaunS
@TayshaunS - np, de nada, gracias por la Q y buena suerte con awk.
slm
5

El siguiente ejemplo cuenta las veces que se me menciona sin necesidad del lastloggedinarchivo:

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

Si insiste en usar o se ve obligado a usar el lastloggedinarchivo, puede hacerlo de esta manera:

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

Se usa $1~/some_chars/para obtener todos los nombres de usuario que contienen los caracteres dados o $1~/^prefix/para hacer coincidir solo los nombres que comienzan con prefix:

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


PD:

Escanee man awkpara obtener más pistas ... ;-)

awk es muy gratificante: puedes hacer muchas cosas después de muy poco tiempo de aprendizaje ...


fuente
2

La última lata incluye los inicios de sesión de los usuarios de reinicios anteriores. Como tal, lo siguiente solo imprimirá a los usuarios desde el último reinicio:

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

La primera parte del comando awk especifica un rango: comience desde la primera fila hasta que la primera columna se 'reinicie'.

Corazón oscuro
fuente