Подсчет записей, соответствующих шаблону с Awk

12

Так что мне сказали сделать, last > lastloggedinкоторый создает файл, который показывает классы последнего входа в систему с момента последней перезагрузки системы, и теперь меня просят написать скрипт Awk с именем, myawkкоторый подсчитывает / определяет, сколько строк lastloggedinсодержат строку CFS264.

я сделал grep -c CFS264 lastloggedin

TayshaunS
источник
Вы должны использовать awk? Если нет, вы можете просто использовать grep -c CFS264 lastloggedin | wc -l.
Аксель
2
@ Аксель: всегдаgrep -c (something) (something) | wc -l будет выдавать «1».
G-Man говорит: «Восстанови Монику»

Ответы:

21

Для начала вы можете использовать awkпоиск строк в файле, который содержит строку, например:

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

Биты в { .... }будут командами, необходимыми для подсчета количества строк с этой строкой. Чтобы подтвердить, что вышеприведенное работает, вы можете использовать print $0там, чтобы просто напечатать те строки, которые содержат строку поиска.

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

Что касается подсчета, если вы будете искать «счетчик awk», вы наткнетесь на это SO Q & A под названием: использование awk для подсчета количества записей . Показанного там метода будет достаточно для того, что вы описываете:

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

пример

$ last > lastloggedin

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

$ grep slm lastloggedin  | wc -l
758

$ grep -c slm lastloggedin
758

ПРИМЕЧАНИЕ. Вы не говорите, какое поле CFS264 относится к lastвыводу. Предполагая, что это имя пользователя, вы можете дополнительно ограничить awkкоманду для поиска только в этом поле следующим образом:

$ awk '$1=="CFS264" { print $0 }' lastloggedin
SLM
источник
извините, cfs264 является частью имени пользователя. Спасибо, ребята, что нашли время помочь мне разобраться в этом, я был очень смущен и расстроен.
TayshaunS
@TayshaunS - np, пожалуйста, спасибо за Q и удачи awk.
SLM
5

Следующий пример подсчитывает время, которое я упоминал, без необходимости lastloggedinфайла:

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

Если вы настаиваете на использовании или вынуждены использовать lastloggedinфайл, вы можете сделать это следующим образом:

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

Используйте $1~/some_chars/для получения всех имен пользователей, содержащих указанные символы, или $1~/^prefix/для сопоставления только имен, начинающихся с prefix:

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


PS:

Сканирование man awkдля получения дополнительных подсказок ... ;-)

awk очень полезно: вы можете сделать много вещей после очень короткого времени обучения ...


источник
2

Последний может включать в себя логины пользователей из предыдущих перезагрузок. Таким образом, следующее будет печатать только пользователей с момента последней перезагрузки:

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

Первая часть команды awk задает диапазон - начиная с первой строки и заканчивая первой перезагрузкой.

Темное сердце
источник