2008-09-24 37 views
9

Tôi có nhật ký truy cập máy chủ, với dấu thời gian của mỗi yêu cầu http, tôi muốn nhận được số lượng yêu cầu ở mỗi giây. Sử dụng sedcut -c, cho đến nay tôi đã quản lý để cắt file xuống chỉ còn các timestamps, chẳng hạn như:Đếm số lần xuất hiện mã thông báo trong một tệp

22-Tháng Chín-2008 20:00:21 +0000
22-Sep-2008 20:00:22 +0000
22-Sep-2008 20:00:22 +0000
22-Sep-2008 20:00:22 +0000
22-Sep-2008 20:00:24 +0000
22-Sep-2008 20:00:24 +0000

Điều tôi muốn đạt được là n số lần mỗi dấu thời gian duy nhất xuất hiện trong tệp. Ví dụ, với ví dụ trên, tôi muốn để có được đầu ra mà trông giống như:

22-Sep-2008 20:00:21 +0000: 1
22-Sep-2008 20:00: 22 0000: 3
22-Sep-2008 20:00:24 +0000: 2

tôi đã sử dụng sort -u để lọc danh sách các timestamps xuống một danh sách các thẻ độc đáo, hy vọng rằng tôi có thể sử dụng grep như

grep -c -f <file containing patterns> <file> 

nhưng điều này chỉ tạo ra một dòng của một số lượng lớn các dòng phù hợp.

Tôi biết điều này có thể được thực hiện trong một dòng, xâu chuỗi một vài tiện ích với nhau ... nhưng tôi không thể nghĩ về điều đó. Có ai biết không?

Trả lời

32

Tôi nghĩ rằng bạn đang tìm kiếm

uniq --count 

-c, --count dòng tiền tố bằng số lần xuất hiện

+5

Lưu ý rằng với các bộ dữ liệu khác, bạn có thể cần phải sắp xếp (1) trước khi uniq (1), vì uniq sẽ chỉ nhóm điều chỉnh acent trùng lặp. –

+0

Có, nhưng OP đã nói anh ấy sắp xếp mọi thứ nên tôi cho rằng anh ấy đang đứng đầu loại điều đó ... –

+0

Tôi đã phải sử dụng 'uniq -c' trên OS X,' --count' đã cho tôi một lỗi. –

-2

có thể sử dụng xargs? Không thể đặt tất cả cùng nhau trong đầu của tôi tại chỗ ở đây, nhưng sử dụng xargs trên sắp xếp của bạn -u để cho mỗi giây duy nhất bạn có thể grep tập tin gốc và làm một wc -l để có được số.

1

Sử dụng AWK với mảng liên kết có thể là một giải pháp khác cho điều này.

1

Chỉ trong trường hợp bạn muốn đầu ra ở định dạng mà bạn ban đầu được xác định (với số lần xuất hiện ở cuối):

uniq -c logfile | sed 's/\([0-9]+\)\(.*\)/\2: \1/' 
0

Sử dụng awk:

cat file.txt | awk '{count[$1 " " $2]++;} \ 
        END {for(w in count){print w ": " count[w]};}' 
0

giải pháp của Tom:

awk '{count[$1 " " $2]++;} END {for(w in count){print w ": " count[w]};}' file.txt 

hoạt động tổng quát hơn.

tập tin của tôi đã không được sắp xếp:

name1 
name2 
name3 
name2 
name2 
name3 
name1 

Do đó những sự cố không được sau mỗi khác, và uniq không hoạt động như nó mang lại:

1 name1 
1 name2 
1 name3 
2 name2 
1 name3 
1 name1 

Với tuy nhiên kịch bản awk:

name1:2 
name2:3 
name3:2 
Các vấn đề liên quan