Hitung pola pencocokan catatan dengan Awk


12

Jadi saya diberitahu untuk melakukan last > lastloggedinyang membuat file yang menunjukkan kelas masuk terakhir sejak sistem terakhir reboot, dan sekarang saya diminta untuk menulis skrip Awk yang bernama myawkyang menghitung / menentukan berapa banyak baris lastloggedinberisi string CFS264.

saya sudah selesai grep -c CFS264 lastloggedin


Apakah Anda harus menggunakan awk? Jika tidak, Anda bisa menggunakannya grep -c CFS264 lastloggedin | wc -l.
Axel

2
@Axel: grep -c (something) (something) | wc -lakan selalu menghasilkan "1".
G-Man Mengatakan 'Reinstate Monica'

Jawaban:


21

Untuk memulai, Anda dapat menggunakan awkuntuk mencari baris dalam file yang berisi string seperti:

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

Bit dalam { .... }akan menjadi perintah yang dibutuhkan untuk menghitung jumlah baris dengan string itu. Untuk mengonfirmasi bahwa cara di atas berfungsi, Anda dapat menggunakan a print $0di sana untuk hanya mencetak baris yang berisi string pencarian.

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

Mengenai penghitungan, jika Anda mencari "counter awk" Anda akan menemukan SO Q&A ini berjudul: menggunakan awk untuk menghitung tidak ada catatan . Metode yang ditunjukkan di sana akan cukup untuk apa yang Anda gambarkan:

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

Contoh

$ last > lastloggedin

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

$ grep slm lastloggedin  | wc -l
758

$ grep -c slm lastloggedin
758

CATATAN: Anda tidak mengatakan bidang mana yang terkait dengan CFS264 di lastoutput. Dengan asumsi itu adalah nama pengguna maka Anda selanjutnya dapat membatasi awkperintah untuk mencari hanya bidang itu seperti:

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

maaf, cfs264 adalah bagian dari nama pengguna. Terima kasih teman-teman telah meluangkan waktu Anda untuk membantu saya mengetahui hal ini, saya menjadi agak bingung dan frustrasi.
TayshaunS

@ TayshaunS - np, terima kasih banyak, terima kasih untuk Q dan semoga sukses awk.
slm

5

Contoh berikut menghitung waktu saya disebutkan tanpa perlu lastloggedinfile:

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

Jika Anda bersikeras menggunakan atau dipaksa untuk menggunakan lastloggedinfile, Anda dapat melakukannya dengan cara ini:

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

Gunakan $1~/some_chars/untuk mendapatkan semua nama pengguna berisiig karakter yang diberikan atau $1~/^prefix/untuk mencocokkan hanya nama yang dimulai dengan prefix:

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


PS:

Pindai man awkpetunjuk lainnya ... ;-)

awk sangat bermanfaat: Anda dapat melakukan banyak hal setelah waktu belajar yang sangat singkat ...


2

Terakhir dapat menyertakan pengguna login dari reboot sebelumnya. Dengan demikian, yang berikut ini hanya akan mencetak pengguna sejak reboot terakhir:

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

Bagian pertama dari perintah awk menentukan rentang - mulai dari baris pertama hingga kolom pertama 'reboot'.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.