Marco Ceppi ถูกต้องเกี่ยวกับawk
การเป็นเครื่องมือที่ดีกว่าสำหรับเรื่องนี้ แต่ awk ยังเป็นเครื่องมือที่ดีกว่าsort
และuniq
เนื่องจากตรรกะนั้นสามารถย้ายเข้ามาawk
ได้ มันไม่ได้ทำให้ความแตกต่างมากถ้าคุณเพียงแค่ tailing 1000 สาย awk
แต่ถ้าคุณต้องการที่จะดูที่แฟ้มบันทึกกิ๊กมากหลายก็สามารถเป็นคำสั่งของขนาดได้เร็วขึ้นที่จะย้ายที่ใน
cat /var/log/apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n
จะทำสิ่งที่คุณต้องการ แต่จะเร็วกว่าสำหรับไฟล์ขนาดใหญ่ มันสร้างอาร์เรย์ของ IP ใน awk โดยใช้ที่อยู่ IP เป็นคีย์และจำนวนครั้งที่ IP เกิดขึ้นเป็นค่า
ความเร็วเพิ่มขึ้นเนื่องจาก awk ทำการส่งผ่านข้อมูลและทำงานส่วนใหญ่ยกเว้นการเรียงลำดับผลลัพธ์สุดท้าย ใช้วิธีอื่นถ้าคุณมี 1,000,000 บรรทัดในบันทึกการโอนย้าย awk อ่าน 1,000,000 บรรทัดที่กระจายออก 1,000,000 IP จากนั้นเรียงลำดับให้ครอบคลุมทั้ง 1,000,000 IP ทั้งหมดและส่ง 1,000,000 IP ที่เรียงตอนนี้ไปยัง uniq ซึ่งลดขนาดให้เล็กลงมาก จำนวนข้อมูลก่อนที่จะให้การเรียงลำดับ แทนที่จะไปป์ / ทำหลายรอบบน 1,000,000 IP, awk ทำเกือบทุกอย่างในครั้งเดียว
ใช้บันทึก apache 5,513,132 line (1.1 gigs) บนแล็ปท็อปของฉันนี่เป็นการเปรียบเทียบความเร็ว:
- 2m 45s
cat ./apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1
- 0m 40s
cat ./apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n