2013-04-13 42 views
73

Tình huống:

Tôi có một tập tin lớn và địa chỉ IP và cổng từ mạng chụp vài giờ, một ip/cổng trên mỗi dòng. Dòng này là của định dạng này:Bash Script: đếm các dòng duy nhất trong tập tin

ip.ad.dre.ss[:port] 

mong muốn kết quả:

Có một mục nhập cho mỗi gói tin tôi nhận được khi đăng nhập, vì vậy có rất nhiều các địa chỉ trùng lặp. Tôi muốn để có thể chạy thông qua một kịch bản shell của một số loại mà sẽ có thể làm giảm nó để dòng định dạng

ip.ad.dre.ss[:port] count 

nơi count là số lần xuất hiện của địa chỉ cụ thể (và cổng). Không có công việc đặc biệt nào phải được thực hiện, xử lý các cổng khác nhau như các địa chỉ khác nhau.

Cho đến nay, tôi đang sử dụng lệnh này để cạo tất cả các địa chỉ IP từ các log file:

grep -o -E [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+(:[0-9]+)? ip_traffic-1.log > ips.txt 

Từ đó, tôi có thể sử dụng một regex khá đơn giản để cạo ra tất cả các địa chỉ ip đã được gửi theo địa chỉ của tôi (mà tôi không quan tâm đến)

tôi sau đó có thể sử dụng sau đây để trích xuất các mục duy nhất:

sort -u ips.txt > intermediate.txt 

tôi không biết làm thế nào tôi có thể tổng hợp các dòng c ounts bằng cách nào đó với phân loại.

Trả lời

196

Bạn có thể sử dụng lệnh uniq để biết được số lượng dòng lặp lại được sắp xếp:

sort ips.txt | uniq -c 

Để có được kết quả thường gặp nhất ở đầu (nhờ Peter JARIC):

sort ips.txt | uniq -c | sort -bgr 
+27

Follow-up: Bây giờ tôi sử dụng nó theo nghĩa đen mỗi ngày. Làm sao tôi có thể sống sót mà không có nó. – Wug

+12

Tôi đến đây để bỏ phiếu, nhưng nó đã được tôi bỏ phiếu. – Worker

+11

Thêm một loại khác để có được kết quả phổ biến nhất ở trên cùng: 'sort ips.txt | uniq -c | sort -bgr' –

Các vấn đề liên quan