Policz rekordy pasujące do wzorca za pomocą Awk


13

Kazano mi więc zrobić, last > lastloggedinktóry tworzy plik, który pokazuje ostatnie logowanie klas od ostatniego restartu systemu, a teraz jestem proszony o napisanie skryptu Awk o nazwie, myawkktóry zlicza / określa, ile wierszy lastloggedinzawiera łańcuch CFS264.

zrobiłem grep -c CFS264 lastloggedin


Czy musisz użyć awk? Jeśli nie, możesz po prostu użyć grep -c CFS264 lastloggedin | wc -l.
Axel

2
@Axel: grep -c (something) (something) | wc -lbędzie zawsze produkować "1".
G-Man mówi „Przywróć Monikę”

Odpowiedzi:


21

Na początek możesz użyć awkdo wyszukiwania wierszy w pliku, który zawiera ciąg znaków:

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

Bity w { .... }będą poleceniami wymaganymi do wyrównania liczby linii z tym ciągiem. Aby potwierdzić, że powyższe działa, możesz użyć print $0tam, aby po prostu wydrukować te wiersze, które zawierają szukany ciąg.

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

Jeśli chodzi o liczenie, jeśli szukasz „licznika awk”, natkniesz się na to SO Q&A zatytułowane: użycie awk do zliczenia liczby rekordów . Pokazana tam metoda wystarczy dla tego, co opisujesz:

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

Przykład

$ last > lastloggedin

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

$ grep slm lastloggedin  | wc -l
758

$ grep -c slm lastloggedin
758

UWAGA: Nie podajesz, które pole CFS264 dotyczy danych lastwyjściowych. Zakładając, że jest to nazwa użytkownika, możesz dodatkowo ograniczyć awkpolecenie do wyszukiwania tylko tego pola w następujący sposób:

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

przepraszam, cfs264 jest częścią nazwy użytkownika. Dziękuję wam za poświęcony czas, który pomógł mi to rozgryźć, byłem bardzo zdezorientowany i sfrustrowany.
TayshaunS

@TayshaunS - np. Jesteś bardzo mile widziany, dziękuję za Q i powodzenia awk.
slm

5

Poniższy przykład zlicza czasy, o których jestem wspomniany bez potrzeby używania lastloggedinpliku:

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

Jeśli nalegasz na użycie lastloggedinpliku lub jesteś zmuszony go użyć , możesz to zrobić w ten sposób:

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

Użyj, $1~/some_chars/aby uzyskać wszystkie nazwy użytkowników zawierające podane znaki lub $1~/^prefix/dopasować tylko nazwy zaczynające się od prefix:

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


PS:

Wyszukaj man awkwięcej wskazówek ... ;-)

awk jest bardzo satysfakcjonujące: Możesz zrobić wiele rzeczy po bardzo krótkim czasie nauki ...


2

Ostatnia może obejmować logowanie użytkowników z poprzednich restartów. W związku z tym następujące informacje będą drukować tylko użytkownicy od ostatniego uruchomienia:

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

Pierwsza część polecenia awk określa zakres - zacznij od pierwszego wiersza, aż pierwsza kolumna zostanie „uruchomiona ponownie”.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.