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


13

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

я закінчив grep -c CFS264 lastloggedin


Чи потрібно використовувати awk? Якщо ні, ви можете просто скористатися grep -c CFS264 lastloggedin | wc -l.
Аксель

2
@Axel: 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

Вибачте, 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 вказує діапазон - починати з першого рядка до першого перезавантаження стовпця.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.