Score:0

อ่านบันทึกแบบเรียลไทม์ด้วย bash

ธง be

ฉันมีสิ่งนี้ในบันทึกของระบบ:

27 ก.พ. 02:53:51 Latitude-E6430 rsyslogd: การดำเนินการขึ้น 7
27 ก.พ. 02:53:51 Latitude-E6430 rsyslogd: การดำเนินการลง B
27 ก.พ. 02:53:51 Latitude-E6430 rsyslogd: ดำเนินการขึ้น U
....เป็นต้น

ฉันต้องการสร้างสคริปต์ที่ตรวจสอบบันทึกแบบเต็มเวลาเป็นบริการ แต่ฉันไม่รู้วิธีการทำเงื่อนไข

1 - เมื่อคุณอ่าน ทีละบรรทัด เก็บไว้ในตัวแปร

2 - อ่านตัวแปร หากพบในบรรทัด คำว่า [rsyslogd] และ [7] จะแสดง [echo "Found" ]

มันจะเป็นการวนซ้ำเพื่ออ่านไฟล์ทีละบรรทัดโดยมองหารูปแบบของคำนั้น

ตัวอย่างสคริปต์

path_full_log="/home/full.log"


ฟังก์ชัน reader_time_real(){

    ขณะอ่าน full_log; ทำ
        chek7=$(แมว $full_log | grep "rsyslogdd" | grep 7 )
            ถ้า [[ $? = 0 ]]; แล้ว 
                echo "พบ 7";

            ไฟ

        chekB=$(cat $full_log | grep "rsyslogdd" | grep B )
            ถ้า [[ $? = 0 ]]; แล้ว 
                echo "พบ B";

            ไฟ
    เสร็จแล้ว < $path_full_log
}
David avatar
cn flag
แสดงสคริปต์ที่คุณสร้างเพื่อให้คนอื่นเห็นว่าข้อผิดพลาดอาจเป็นอย่างไร
BurstBass BurstBass avatar
be flag
เรียบร้อย...ขึ้นลง
Soren A avatar
mx flag
โปรดเพิ่มสคริปต์ของคุณในคำถามของคุณ ไม่ใช่คำตอบ ... มันอาจจะถูกปิด
WU-TANG avatar
cn flag
นี่ไม่ใช่ฟังก์ชั่นของ rsyslog ตามธรรมชาติใช่ไหม ฉันเพิ่งกำหนดค่าเซิร์ฟเวอร์ syslog-ng แต่ฉันคิดว่ามันคล้ายกันมากพอที่ทั้งคู่จะทำตัวกรองได้ ???
BurstBass BurstBass avatar
be flag
มันไม่เหมือนกัน ผมระบุทั้ง 2 อย่างว่าต้องมีคำว่า "rsyslogdd" และตัวแปรที่เป็นไปได้ 2 แบบ คือ 7 หรือ B
BurstBass BurstBass avatar
be flag
แก้ไขแล้ว เพียงแค่เปลี่ยน `cat $full_log` เป็น `echo $full_log`
Lorenz Keel avatar
gr flag
@BurstBass BurstBass ถ้าคุณแก้ไข ให้ใส่คำตอบด้วยตัวคุณเองด้วยสคริปต์เวอร์ชันสุดท้าย จากนั้นยอมรับคำตอบของคุณเอง
WU-TANG avatar
cn flag
@BurstBassBurstBass หากคุณตอบฉัน (คุณไม่ได้แท็กใคร) ฉันคิดว่าคุณเข้าใจผิดในสิ่งที่ฉันพูด .... ฉันกำลังบอกว่า "ฉันคิดว่า" syslog นั้นมีความสามารถในตัวที่จะทำสิ่งที่ สคริปต์ของคุณกำลังทำอยู่ ฉันเคยกำหนดค่าเซิร์ฟเวอร์ syslog-ng มาก่อน และฉันตั้งค่าตัวกรองเพื่อจับคำและส่งไปยังบันทึกแยกต่างหาก (แม้แต่คำสั่งทริกเกอร์) ฉันคิดว่า rsyslog มีฟังก์ชันการทำงานเหมือนกัน
Score:1
ธง vn

ฉันได้สร้างสคริปต์ต่อไปนี้ ซึ่งอัปเดตทุกวินาที และไฮไลต์รายการบันทึกใหม่ใดๆ นอกจากนี้ยังกำหนดพื้นที่ที่ควรแสดงบันทึก (ด้วยไฟล์ โลโกว์ และ ล็อกคอล ตัวแปร) ดังนั้นจึงสร้างขึ้นเพื่อใช้ในหน้าต่างเทอร์มินัลขนาดคงที่ (ฉันใช้ภายใน tmux)

คุณอาจแก้ไขสคริปต์นี้เพื่อเน้นเฉพาะบรรทัดที่ตรงกับเกณฑ์เฉพาะตามที่คุณระบุ

#!/bin/bash

# ตัวแปรการกำหนดค่าเริ่มต้น
โลโกรว์ส=31
ล็อกคอล=127

# นิยามฟังก์ชันท้องถิ่น
พิมพ์ใหม่ () {
  แจ่มใส
  เสียงสะท้อน -e "\e[0;30;47m"
  hightail=$(หาง -n "$logrows" /var/log/syslog | ตัด -b "1-$logcols")
  เสียงสะท้อน -ne "${hightail}\e[0m"
}

พิมพ์ดิฟ () {
  (( newrows = logrows - logdiff ))
  แจ่มใส
  normtail=$(หาง -n "$logrows" /var/log/syslog | หัว -n "$newrows" | ตัด -b "1-$logcols")
  เสียงสะท้อน -n "$normtail"
  เสียงสะท้อน -e "\e[0;30;47m"
  hightail=$(หาง -n "$logdiff" /var/log/syslog | ตัด -b "1-$logcols")
  เสียงสะท้อน -ne "${hightail}\e[0m"
}

พิมพ์เก่า () {
  แจ่มใส
  normtail=$(หาง -n "$logrows" /var/log/syslog | ตัด -b "1-$logcols")
  เสียงสะท้อน -n "$normtail"
}

#วนซ้ำทุกวินาที
ในขณะที่จริง
ทำ
  นอน 1 &

  # อ่านขนาดบันทึก
  logsize=$(wc -l /var/log/syslog | ตัด -d ' ' -f1)
  (( logdiff = ขนาดล็อก - ขนาดล่วงหน้า ))

  # ถ้ามากกว่า $logrows บรรทัดใหม่
  ถ้า (( logdiff > "$logrows" ))
  แล้ว
    พิมพ์ใหม่
    วาดใหม่=1
  # ถ้าน้อยกว่า $logrows บรรทัด แต่มากกว่า 0 บรรทัดใหม่
  เอลิฟ (( logdiff > 0 ))
  แล้ว
    พิมพ์ดิฟ
    วาดใหม่=1
  #หากไม่มีบรรทัดใหม่
  อื่น
    ถ้า [[ "$ วาดใหม่" -eq 1 ]]
    แล้ว
      พิมพ์เก่า
      วาดใหม่=0
    ไฟ
  ไฟ

  presize="$logsize"
  รอ #นอน
เสร็จแล้ว

สคริปต์ถูกสร้างขึ้นโดยคำนึงถึง 3 สถานการณ์:

  1. เนื้อหาทั้งหมดของ โลโกว์ ใหม่ - ทุกอย่างถูกเน้น (พิมพ์ใหม่).
  2. บันทึกบางบรรทัดเป็นของใหม่ - บรรทัดเหล่านี้ถูกเน้น (พิมพ์ดิฟ).
  3. ไม่มีบรรทัดบันทึกใหม่ - ไม่มีอะไรถูกเน้น (พิมพ์เก่า).

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

Score:1
ธง in

สคริปต์ของคุณไม่เหมาะที่จะทำสิ่งที่คุณอยากทำ มันอ่านไฟล์เพียงครั้งเดียว แต่สมบูรณ์ หากคุณวนซ้ำ คุณจะไม่ได้รับเพียงเอาต์พุตใหม่เท่านั้น และมันจะเป็นฝันร้ายด้านประสิทธิภาพ

นอกจากนี้ คุณยังใช้ประโยชน์อย่างไร้ประโยชน์ แมว, คุณ เกรป สตริงคงที่ด้วยรูปแบบ regex และบันทึกผลลัพธ์ในตัวแปรที่คุณไม่ได้ใช้อีกต่อไป นอกจากนี้ คุณไม่ควรใช้ตัวแปรชื่อไฟล์ที่ไม่มีเครื่องหมายคำพูด


ใช้ หาง -f | grep --line-บัฟเฟอร์:

หาง -fn0 "$path_full_log" \
| grep -F --line-บัฟเฟอร์ 'rsyslogdd' \
| grep -Eo --line-บัฟเฟอร์ '(7|B)' \
| ขณะอ่านบรรทัด ทำ
      echo "พบ $line"
  เสร็จแล้ว

หรือใช้ xargs:

หาง -fn0 "$path_full_log" \
| grep -F --line-บัฟเฟอร์ 'rsyslogdd' \
| grep -Eo --line-บัฟเฟอร์ '(7|B)' \
| xargs -I{} echo "พบ {}"
  • หาง -fn0 อ่านบรรทัดใหม่ของไฟล์เมื่อมีการเพิ่ม
  • grep -F ค้นหาสตริงคงที่ในบรรทัดนั้น
  • --line-บัฟเฟอร์ บอก เกรป เพื่ออ่านบรรทัดเมื่อเข้ามาแทนที่จะรอการสิ้นสุดของสตรีมอินพุตซึ่งเป็นค่าเริ่มต้น
  • grep -Eo ค้นหา เอ่อ ลวดลาย (-E) (7|ข) และส่งออกเฉพาะสตริงที่ตรงกัน (-o).
  • ขณะอ่านไลน์ หรือ xargs -I{} รับเอาต์พุตนั้นและรันคำสั่งของคุณบนเอาต์พุต (ที่นี่: เสียงสะท้อน).

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา