Đếm hồ sơ phù hợp với mẫu với Awk


12

Vì vậy, tôi được yêu cầu last > lastloggedintạo một tệp hiển thị các lớp đăng nhập lần cuối kể từ lần khởi động lại hệ thống cuối cùng và bây giờ tôi được yêu cầu viết một tập lệnh Awk có tên myawklà đếm / xác định có bao nhiêu dòng lastloggedinchứa chuỗi CFS264.

Tôi đã thực hiện grep -c CFS264 lastloggedin


Bạn có phải sử dụng awk? Nếu không, bạn chỉ có thể sử dụng grep -c CFS264 lastloggedin | wc -l.
Axel

2
@Axel: grep -c (something) (something) | wc -lsẽ luôn tạo ra "1".
G-Man nói 'Phục hồi Monica'

Câu trả lời:


21

Để bắt đầu, bạn có thể sử dụng awkđể tìm kiếm các dòng trong tệp có chứa một chuỗi như vậy:

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

Các bit trong { .... }sẽ là các lệnh cần thiết để kiểm đếm số lượng dòng với chuỗi đó. Để xác nhận rằng phần trên đang hoạt động, bạn có thể sử dụng phần print $0trong đó để in những dòng có chứa chuỗi tìm kiếm.

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

Về việc đếm, nếu bạn tìm kiếm "bộ đếm awk", bạn sẽ vấp phải câu hỏi và trả lời SO này có tiêu đề: sử dụng awk để đếm không có hồ sơ . Phương pháp hiển thị ở đó sẽ đủ cho những gì bạn mô tả:

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

Thí dụ

$ last > lastloggedin

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

$ grep slm lastloggedin  | wc -l
758

$ grep -c slm lastloggedin
758

LƯU Ý: Bạn không nói trường CFS264 nào liên quan đến lastđầu ra. Giả sử đó là tên người dùng thì bạn có thể hạn chế thêm awklệnh chỉ tìm kiếm trường đó như sau:

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

xin lỗi, cfs264 là một phần của tên người dùng. Cảm ơn các bạn đã dành thời gian của bạn để giúp tôi tìm ra điều này, tôi đã khá bối rối và thất vọng.
TayshaunS

@TayshaunS - np, bạn khá hoan nghênh, cảm ơn vì Q và chúc may mắn với awk.
slm

5

Ví dụ sau đây đếm số lần tôi được đề cập mà không cần lastloggedintệp:

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

Nếu bạn khăng khăng sử dụng hoặc buộc phải sử dụng lastloggedintệp, bạn có thể thực hiện theo cách này:

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

Sử dụng $1~/some_chars/để lấy tất cả tên người dùng chứa các ký tự đã cho hoặc $1~/^prefix/chỉ khớp với các tên bắt đầu bằng prefix:

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


Tái bút

Quét man awkđể có thêm gợi ý ... ;-)

awk rất bổ ích: Bạn có thể làm được nhiều thứ sau một thời gian ngắn học ...


2

Cuối cùng có thể bao gồm người dùng đăng nhập từ lần khởi động lại trước. Như vậy, phần sau sẽ chỉ in người dùng kể từ lần khởi động lại cuối cùng:

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

Phần đầu tiên của lệnh awk chỉ định một phạm vi - bắt đầu từ hàng đầu tiên cho đến khi cột đầu tiên là 'khởi động lại'.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.