ระบายสีแหล่งข้อมูลที่แตกต่างกันสำหรับหาง


19

ฉันกำลังดูบันทึกต่าง ๆ โดย

tail -q -f /var/log/syslog -f /var/log/fail2ban.log -f /var/log/nginx/error.log

ฉันจะให้เอาต์พุตของแต่ละล็อกสีแตกต่างกันอย่างไร



@ MattBianco ขอบคุณฉันจะได้ดูmultitailและคำตอบในคำถามนี้
Daniel W.

1
นอกเหนือจากคำตอบที่ดีด้านล่างคุณอาจต้องการดูunix.stackexchange.com/questions/26313/colored-find-outputซึ่งแสดงวิธีการทำมากขึ้นด้วยไฟล์เอาต์พุต colorizing
โจ

คำตอบ:


21

ใช้ GNU grepสำหรับการระบายสี:

color() { GREP_COLOR=$1 grep --color '.*'; }

(tail -qf /var/log/syslog | color 31 &
tail -qf /var/log/fail2ban.log | color 32 &
tail -qf /var/log/nginx/error.log | color 33)

โปรดทราบว่า 2 แรกจะเริ่มต้นในพื้นหลัง นั่นหมายความว่าพวกมันจะไม่ถูกฆ่าหากคุณกดCtrl-C(เชลล์ไม่สนใจ SIGINT สำหรับงานอะซิงโครนัสอย่างชัดเจน)

เพื่อป้องกันสิ่งนั้นคุณสามารถทำได้:

color() { GREP_COLOR=$1 grep --line-buffered --color=always '.*'; }

(tail -qf /var/log/syslog | color 31 &
tail -qf /var/log/fail2ban.log | color 32 &
tail -qf /var/log/nginx/error.log | color 33) | cat

ด้วยวิธีนี้เมื่อCtrl-Cสุดท้ายtail+grepและcatตาย (จาก SIGINT) และอีกสอง grep + tails จะตายจาก SIGPIPE ในครั้งต่อไปที่พวกเขาเขียนอะไรบางอย่าง

หรือคืนค่าตัวจัดการ SIGINT (จะไม่ทำงานกับเชลล์ทั้งหมด):

color() { GREP_COLOR=$1 grep --color '.*'; }

((trap - INT; tail -qf /var/log/syslog | color 31) &
(trap - INT; tail -qf /var/log/fail2ban.log | color 32) &
tail -qf /var/log/nginx/error.log | color 33)

คุณยังสามารถทำได้ในcolorฟังก์ชั่น นั่นจะไม่นำไปใช้กับtailแต่tailจะตายของ SIGPIPE ในครั้งต่อไปที่มันเขียนถ้าgrepตาย

color() (trap - INT; GREP_COLOR=$1 exec grep --color '.*')

(tail -qf /var/log/syslog | color 31 &
tail -qf /var/log/fail2ban.log | color 32 &
tail -qf /var/log/nginx/error.log | color 33)

หรือทำให้ทั้งหาง + grep เป็นฟังก์ชัน:

tailc() (trap - INT; export GREP_COLOR="$1"; shift; tail -qf -- "$@" |
   grep --color '.*')
tailc 31 /var/log/syslog &
tailc 32 /var/log/syslog &
tailc 33 /var/log/nginx/error.log

หรือทั้งหมด:

tailc() (
  while [ "$#" -ge 2 ]; do
    (trap - INT; tail -f -- "$2" | GREP_COLOR=$1 grep --color '.*') &
    shift 2
  done
  wait
)

tailc 31 /var/log/syslog 32 /var/log/syslog 33 /var/log/nginx/error.log

เมื่อฉันใส่สิ่งนี้ลงในสคริปต์ "watch.sh" ของฉันมันจะกลับไปที่คอนโซล แต่ข้อความได้รับการพิมพ์โปรดดูi.imgur.com/yaiBwMo.png
Daniel W.

@Dan ดูการแก้ไข
Stéphane Chazelas

ขอบคุณสำหรับความพยายามในการเขียนคำตอบนี้ฉันไปด้วยtailcฟังก์ชั่นที่ใช้งานได้ดีที่สุดและดูง่ายที่สุดในสคริปต์
Daniel W.

4

การเป็นแบบนี้ทำให้ฉันได้:

(tail -f /var/log/syslog | awk -W interactive '{printf "\033[1;31m%s\033[0m\n", $0}' & \
tail -f /var/log/auth.log | awk -W interactive '{printf "\033[1;32m%s\033[0m\n", $0}' & \
tail -f /var/log/Xorg.0.log | awk -W interactive '{printf "\033[1;34m%s\033[0m\n", $0}')

คำอธิบาย:

  • tail -f file: ผนวกข้อมูลเมื่อไฟล์เติบโต
  • awk -W interactive: ตั้งค่าawkเป็นโหมดโต้ตอบ
  • '{printf "\033[1;31m%s\033[0m\n", $0}' พิมพ์เอาท์พุท colorzized ไปยังเครื่อง
  • \033[1;31m หมายถึงสีแดง
  • \033[1;32m หมายถึงสีเขียว
  • \033[1;34m หมายถึงสีฟ้า

-W interactiveน่าจะเป็น - mawkเฉพาะ (วิธีที่mawkบัฟเฟอร์ป้อนข้อมูลตามค่าเริ่มต้นก็ไม่เหมือนกันและ-W interactiveไม่จำเป็นสำหรับawkการใช้งานอื่น ๆ)
Stéphane Chazelas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.