Awk ile desenle eşleşen kayıtları sayma


13

Bu yüzden last > lastloggedin, son sistem yeniden başlatıldığından beri sınıfların son girişini gösteren bir dosya oluşturması gerektiğini söyledim ve şimdi , dizenin myawkkaç satır lastloggediniçerdiğini sayan / belirleyen bir Awk komut dosyası yazmam isteniyor CFS264.

yaptım grep -c CFS264 lastloggedin


Kullanmak zorunda awkmısın? Değilse, sadece kullanabilirsiniz grep -c CFS264 lastloggedin | wc -l.
Axel

2
@Axel: grep -c (something) (something) | wc -lher zaman "1" üretir.
G-Man,

Yanıtlar:


21

Başlamak için aşağıdaki awkgibi dize içeren bir dosyadaki satırları aramak için kullanabilirsiniz :

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

İrade'deki bitler, { .... }bu dizeyle satır sayısını hesaplamak için gereken komutlardır. Yukarıdakilerin çalıştığını doğrulamak için print $0, orada arama dizesini içeren satırları yazdırmak için orada bir kullanabilirsiniz .

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

Sayma ile ilgili olarak, "awk sayacı" için arama yaparsanız şu SO Q&A başlıklı tökezleyeceksiniz: kayıt sayısını saymak için awk kullanma . Orada gösterilen yöntem tarif ettiğiniz şeyler için yeterli olacaktır:

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

Misal

$ last > lastloggedin

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

$ grep slm lastloggedin  | wc -l
758

$ grep -c slm lastloggedin
758

NOT: Çıkışta hangi alanın CFS264 ile ilgili olduğunu söylemezsiniz last. Bir kullanıcı adı olduğunu varsayarsak, awkkomutu yalnızca aşağıdaki gibi arama yapmak için kısıtlayabilirsiniz :

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

üzgünüz, cfs264 bir kullanıcı adının bir parçasıdır. Bunu çözmeme yardım etmek için zaman ayırdığınız için teşekkür ederim, oldukça karışık ve sinirli oluyordum.
TayshaunS

@TayshaunS - np, oldukça hoş geldiniz, Q için teşekkürler ve iyi şanslar awk.
slm

5

Aşağıdaki örnek, lastloggedindosyaya gerek kalmadan bahsedildiğim süreleri sayar :

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

lastloggedinDosyayı kullanmakta ısrar ediyorsanız veya dosyayı kullanmak zorunda kalırsanız , dosyayı şu şekilde yapabilirsiniz:

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

Kullanım $1~/some_chars/tüm kullanıcı adları verilen karakter içeren ürünlerin veya almak için $1~/^prefix/başlayarak Sadece isimleri eşleştirmek için prefix:

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


Not:

man awkDaha fazla ipucu tara ... ;-)

awk çok ödüllendirici: Çok kısa bir öğrenim süresinden sonra birçok şey yapabilirsiniz ...


2

Son kutu, önceki yeniden başlatmalardan kullanıcıların giriş bilgilerini içerir. Bu nedenle, aşağıdakiler yalnızca son yeniden başlatmadan bu yana kullanıcıları basacaktır:

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

Awk komutunun ilk kısmı, ilk satırdan ilk sütunun 'yeniden başlatılmasına' kadar bir aralık belirtir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.