นับบันทึกรูปแบบการจับคู่ด้วย Awk


13

ดังนั้นผมจึงบอกว่าจะทำอย่างไรlast > lastloggedinที่จะสร้างไฟล์ที่แสดงให้เห็นว่าการเรียนเข้าสู่ระบบล่าสุดตั้งแต่รีบูตระบบที่ผ่านมาและตอนนี้ฉันขอให้เขียนสคริปต์ Awk ซึ่งเป็นชื่อmyawkที่นับ / กำหนดวิธีการหลายสายของ มีสตริงlastloggedinCFS264

ฉันเคยทำ grep -c CFS264 lastloggedin


คุณต้องใช้awkหรือไม่? grep -c CFS264 lastloggedin | wc -lถ้าไม่คุณก็สามารถใช้
Axel

2
@Axel: grep -c (something) (something) | wc -lจะเสมอผลิต "1"
G-Man กล่าวว่า 'Reinstate Monica'

คำตอบ:


21

ในการเริ่มต้นคุณสามารถใช้awkเพื่อค้นหาบรรทัดในไฟล์ที่มีสตริงดังนี้

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

บิตใน{ .... }คำสั่งจะเป็นคำสั่งที่จำเป็นในการนับจำนวนบรรทัดด้วยสตริงนั้น เพื่อยืนยันว่าข้างต้นใช้งานได้คุณสามารถใช้ a print $0ในนั้นเพื่อพิมพ์บรรทัดเหล่านั้นที่มีสตริงการค้นหา

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

ในฐานะที่เป็นนับถ้าคุณค้นหา "awk เคาน์เตอร์" คุณจะสะดุดเมื่อนี้ SO Q & A หัวข้อ: การใช้ awk นับไม่มีการบันทึก วิธีที่แสดงมีเพียงพอสำหรับสิ่งที่คุณอธิบาย:

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

ตัวอย่าง

$ last > lastloggedin

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

$ grep slm lastloggedin  | wc -l
758

$ grep -c slm lastloggedin
758

หมายเหตุ:คุณไม่ได้พูดว่า CFS264 เกี่ยวข้องกับฟิลด์ใดในlastเอาต์พุต สมมติว่ามันเป็นชื่อผู้ใช้แล้วคุณสามารถ จำกัดawkคำสั่งให้ค้นหาเฉพาะฟิลด์ดังกล่าวได้ดังนี้:

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

ขออภัย cfs264 เป็นส่วนหนึ่งของชื่อผู้ใช้ ขอบคุณพวกคุณที่สละเวลาเพื่อช่วยฉันคิดเรื่องนี้ฉันรู้สึกสับสนและหงุดหงิดมาก
TayshaunS

@TayshaunS - NP คุณค่อนข้างต้อนรับขอบคุณสำหรับ Q awkและโชคดีที่มี
slm

5

ตัวอย่างต่อไปนี้นับเวลาที่ฉันถูกกล่าวถึงโดยไม่จำเป็นต้องใช้lastloggedinไฟล์:

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

หากคุณยืนยันในการใช้หรือถูกบังคับให้ใช้lastloggedinไฟล์คุณสามารถทำได้ด้วยวิธีนี้:

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

ใช้$1~/some_chars/เพื่อรับชื่อผู้ใช้ทั้งหมดประกอบด้วยตัวอักษรที่กำหนดหรือ$1~/^prefix/เพื่อให้ตรงกับชื่อที่ขึ้นต้นด้วยprefix:

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


PS:

สแกนman awkหาคำแนะนำเพิ่มเติม ... ;-)

awk เป็นรางวัลที่ดีมาก: คุณสามารถทำสิ่งต่าง ๆ มากมายหลังจากช่วงเวลาสั้น ๆ ของการเรียนรู้ ...


2

สุดท้ายสามารถรวมการเข้าสู่ระบบของผู้ใช้จากการรีบูตครั้งก่อน ดังนั้นสิ่งต่อไปนี้จะพิมพ์เฉพาะผู้ใช้ตั้งแต่การรีบูตครั้งล่าสุด:

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

ส่วนแรกของคำสั่ง awk ระบุช่วง - เริ่มจากแถวแรกจนกระทั่งคอลัมน์แรกคือ 'reboot'

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.