วิธีการมีหาง -f แสดงเอาต์พุตสี


265

ฉันต้องการที่จะสามารถส่งออกของไฟล์บันทึกเซิร์ฟเวอร์ที่มีข้อความเช่น:

INFO
SEVERE

ฯลฯ และถ้าเป็นSEVEREเช่นนั้นแสดงบรรทัดเป็นสีแดง ถ้าเป็นINFOสีเขียว ฉันสามารถตั้งค่านามแฝงประเภทใดสำหรับtailคำสั่งที่จะช่วยฉันทำสิ่งนี้


คำตอบ:


234

ลองใช้มัลติแทtail -fนี้เป็นของübergeneralization คุณสามารถรับชมได้หลายไฟล์ในหน้าต่างแยกต่างหากเน้นบรรทัดตามเนื้อหาและอื่น ๆ

multitail -c /path/to/log

สีที่สามารถกำหนดค่าได้ หากรูปแบบสีเริ่มต้นใช้งานไม่ได้ให้คุณเขียนเองในไฟล์ปรับแต่ง ตัวอย่างเช่นการโทรmultitail -cS amir_log /path/to/logด้วยสิ่งต่อไปนี้~/.multitailrc:

colorscheme:amir_log
cs_re:green:INFO
cs_re:red:SEVERE

วิธีแก้ไขปัญหาอื่นหากคุณอยู่บนเซิร์ฟเวอร์ที่ไม่สะดวกในการติดตั้งเครื่องมือที่ไม่ได้มาตรฐานคือการรวมtail -fกับ sed หรือ awk เพื่อเพิ่มลำดับการควบคุมการเลือกสี สิ่งนี้ต้องใช้tail -fเพื่อล้างเอาต์พุตมาตรฐานโดยไม่ชักช้าแม้เมื่อเอาต์พุตมาตรฐานเป็นไพพ์ฉันไม่รู้ว่าการใช้งานทั้งหมดทำสิ่งนี้หรือไม่

tail -f /path/to/log | awk '
  /INFO/ {print "\033[32m" $0 "\033[39m"}
  /SEVERE/ {print "\033[31m" $0 "\033[39m"}
'

หรือด้วยความอดกลั้น

tail -f /path/to/log | sed --unbuffered \
    -e 's/\(.*INFO.*\)/\o033[32m\1\o033[39m/' \
    -e 's/\(.*SEVERE.*\)/\o033[31m\1\o033[39m/'

หาก sed ของคุณไม่ได้ GNU sed แทนที่ด้วยตัวหนีตัวอักษรและลบ\o033--unbuffered

แต่ความเป็นไปได้อีกคือการทำงานtail -fในEmacsบัฟเฟอร์เปลือกและใช้ความสามารถสีไวยากรณ์ของ Emacs


วิธีที่คุณสามารถทำเช่นนี้กับsed? (ขอโทษที่ขี้เกียจและไม่คิดออกเอง!) แต่คุณช่วยเพิ่มsedตัวอย่างด้วย
อาลี

5
@Ali Sed มีความสะดวกน้อยกว่าเพราะไม่มีไวยากรณ์สำหรับอักขระเลี่ยงคุณจำเป็นต้องใช้มันจริงๆในสคริปต์หรือใช้วิธีการอ้างถึงเชลล์เพื่อให้ทำงานได้ฉันขอแนะนำให้คุณใช้ awk
Gilles

8
@Gilles ในของคุณtail -fด้วยawkรหัสถ้าสตริงไม่ได้มีข้อมูลและรุนแรง , สตริงที่ไม่ได้รับการพิมพ์ ฉันจะพิมพ์สตริงที่เหลือได้อย่างไร? (สตริงไม่จำเป็นต้องได้รับการสี)
เบนจามิน

6
@Benjamin เพิ่ม; nextก่อนปิดวงเล็บที่จะข้ามไปประมวลผลต่อไปและสายการประมวลผลใหม่1 {print}ที่สิ้นสุด ( 1หมายถึงเสมอ)
Gilles

3
sed --unbuffered -e 's/\(.*FATAL.*\)/\o033[1;31m\1\o033[0;39m/' -e 's/\(.*ERROR.*\)/\o033[31m\1\o033[39m/' -e 's/\(.*WARN.*\)/\o033[33m\1\o033[39m/' -e 's/\(.*INFO.*\)/\o033[32m\1\o033[39m/' -e 's/\(.*DEBUG.*\)/\o033[34m\1\o033[39m/' -e 's/\(.*TRACE.*\)/\o033[30m\1\o033[39m/' -e 's/\(.*[Ee]xception.*\)/\o033[1;39m\1\o033[0;39m/'
DmitrySandalov

120

grc , colourizer ทั่วไปค่อนข้างเจ๋ง

apt-get install grc

แค่ทำ

grc tail -f /var/log/apache2/error.log

และสนุกสนาน!

นอกจากนี้คุณยังจะพบมันบนGitHub


2
นี่คือสิ่งที่ฉันต้องการ: น้ำหนักเบาและเรียบง่าย การระบายสีไม่เหมาะกับประเภทบันทึกของฉัน (บันทึกที่กำหนดเอง) แต่การระบายสีใด ๆ ทำให้ฉันสามารถติดตามบันทึกได้ง่ายขึ้น
rennat

สำหรับฉัน 'grc' เกี่ยวกับข้อผิดพลาดของเดเบียนด้วย: OSError: [Errno 13] ปฏิเสธการอนุญาต นอกจากนี้ยังขึ้นอยู่กับการติดตั้ง Python ดังนั้นจึงไม่ได้มีน้ำหนักเบาอีกเว้นแต่คุณมีอยู่แล้ว ฉันพบว่า 'ccze' ทำงานได้ดีขึ้นมากเช่นกัน 'tail -f -n 50 /var/log/starbound-server.log | ccze -A '
Daniel Sokolowski

1
การตั้งค่าเริ่มต้น grc ใน Ubuntu ไม่แสดงผลที่ดีสำหรับ syslogs หรือ mail.log มันไม่ง่ายที่จะเข้าใจวิธีปรับแต่งมัน
lepe

1
ฉันพบว่ามันเป็นวิธีที่เร็วและง่ายกว่าในการเปลี่ยนสีมากกว่ามัลติทาสก์ เพิ่งติดตั้งอย่างรวดเร็วผ่านทางแหล่งข้อมูลบนระบบ CentOS ของฉันและอัพเกรดชีวิตของฉัน จะติดตั้งในระบบอื่นของฉันด้วย
zeeshan

4
นี่มันดูแย่มากในบันทึก nginx i.imgur.com/aJbIOfL.png
mpen

51

คุณเคยดูcczeหรือไม่? คุณมีความเป็นไปได้ที่จะปรับแต่งสีเริ่มต้นของคำหลักบางคำโดยใช้ตัวเลือก-cหรือโดยตรงในไฟล์กำหนดค่าของคุณ -Aถ้าหน้าจอของคุณคือการล้างหลังจากระบายสีคุณต้องใช้ตัวเลือก

แก้ไข:

หากคุณต้องการให้มีเส้นสีแดงทั้งหมดคุณสามารถลองทำสิ่งต่อไปนี้:

$ tail -f myfile.log | perl -pe 's/.*SEVERE.*/\e[1;31m$&\e[0m/g'

\e[1;31mจะให้คุณสีแดง หากคุณต้องการบางสีเหลืองใช้และสำหรับการใช้งานสีเขียว\e[1;33m คืนสีข้อความปกติ\e[1;32m\e[0m


1
สิ่งนี้ใช้ไม่ได้กับ Mac - ฉันกำลังอัปเดตเพราะมันใช้ได้กับ Linux
อาเมีย

การถอนเงินเนื่องจากในขณะที่เคล็ดลับ perl / ansi อาจไม่ ccze ทำ
Shadur

1
นอกจากนี้คุณยังสามารถสร้างสถานีของคุณส่งการแจ้งเตือนหรือ "เสียงเตือน" โดยการเพิ่ม\007การสิ้นสุดของ regex perl -pe 's/(ERROR)/\033[31m$1\033[0m\007/g;'เช่นดังนั้น: มันใช้งานได้ดีมากถ้าคุณใช้ tmux ด้วยset -g bell-action anyซึ่งในกรณีนี้ถ้าคุณมี log tailing ในหน้าต่างอื่นชื่อหน้าต่างนั้นจะแจ้งเตือนเมื่อ regex พบการจับคู่
jonyamo

@AmirAfghani นี่คือเว็บไซต์ linux / unix SE ดังนั้นฉันไม่แน่ใจว่าทำไมคุณคิดว่ามันจะทำงานบน mac
BЈовић

1
@ BЈовић Mac เป็น Unix
Chris Down

34

ลองดูที่lnavโปรแกรมดูไฟล์บันทึกขั้นสูง

lnav lnav

มันยังสามารถพิมพ์รูปแบบต่าง ๆ สวย

ก่อน:

lnav ก่อนสวย

หลังจาก:

lnav สวย


นอกเหนือจากชุดเครื่องมือการวิเคราะห์บันทึกที่ยอดเยี่ยมจริงๆ ขอบคุณสำหรับคำแนะนำ
Patrik Alienus

24

คุณสามารถใช้รุ้งซึ่ง colorizes เส้นตามนิพจน์ปกติ:

rainbow --red='SEVERE.*' --green='INFO.*' tail -f my-file.log

นอกจากนี้ยังมาพร้อมกับการกำหนดค่าที่กำหนดไว้ล่วงหน้าเช่นบันทึก Tomcat:

rainbow --config=tomcat tail -f my-file.log

(ข้อจำกัดความรับผิดชอบ: ฉันเป็นผู้เขียน)


2
ฉันพยายามแก้ปัญหาอื่น ๆ ส่วนใหญ่ที่เสนอให้กับคำถามนี้ แต่สายรุ้งเป็นเพียงโซลูชันเดียวที่ทำงานได้ดีบนดวงอาทิตย์ aix, linux, termux, darwin และ cygwin - 6 (!) สภาพแวดล้อมที่ฉันใช้เป็นประจำทุกวัน คนอื่น ๆ ทั้งหมดเกี่ยวข้องกับกระบวนการสร้างแบบพกพาที่ยากสำหรับบางแพลตฟอร์มอย่างน้อย
Stabledog

1
rainbowมันยอดเยี่ยม คุณเป็นผู้แต่งหรือไม่ ถ้าเป็นเช่นนั้นโปรดแก้ไขคำตอบของคุณด้วยการระบุแหล่งที่มานั้น
บิชอป

ใช่ขอโทษแก้ไขแล้ว
nicoulaj

15

คุณสามารถใช้colortail :

colortail -f /var/log/messages

2
+1 พร้อมที่เก็บ Ubuntu สิ่งที่ฉันชอบ colortail เทียบกับ ccze คือคุณสามารถปรับแต่งรูปแบบของคุณได้อย่างอิสระโดยใช้ RegEx สีที่มีจำหน่าย: สีดำ, สีดำสดใส, สีขาว, สีขาวสว่าง, สีม่วงแดง, สีม่วงแดง, สีฟ้า, สีฟ้าสดใสสีเขียว, สีเขียว, สีเหลืองสดใส, สีเหลือง, สีเหลือง, สีแดง, สีฟ้า, สีฟ้า น่าเสียดายที่ไม่มีวิธีการตั้งค่าตัวหนาหรือสีอื่นเช่นสีส้ม
lepe

ฉันต้องการที่จะแก้ไขจุดหนึ่งเกี่ยวกับความคิดเห็นก่อนหน้าของฉัน "สดใส" สี + รวมถึง "ตัวหนา" (บางสีจริงจะดูสดใสเช่นกัน)
Lepe

ฉันลองสิ่งนี้บน Ubuntu 18 และมันไม่ทำงาน การตั้งค่าเป็นแบบหลายขั้นตอนและคำแนะนำที่คลุมเครือ ยังไม่แน่ใจว่าเป็นส่วนที่ฉันทำผิด; ส่วนสุดท้ายจะชัดเจนขึ้น "หลังจากนั้นคุณอาจต้องการคัดลอกและแก้ไขไฟล์ config ตัวอย่างไปยังที่อื่นฉันมีพวกเขาใน ~ / .colortail /"
Dawoodjee

เพียงติดตั้ง colortail ด้วยapt install colortailและควรทำงานโดยไม่ต้องแก้ไข ~ / .colortail / ด้วย
Kartik M

11

นอกจากนี้โปรดทราบว่าหากคุณต้องการค้นหาregex ที่ตรงกันหนึ่งตัว grep ของ GNU --colorจะทำงานได้ - เพียงไพพ์tailเอาต์พุตของคุณผ่านสิ่งนั้น


OP ต้องการเน้นเฉพาะผลลัพธ์เท่านั้นไม่ใช่กรอง grep จะไม่แสดงเส้นไม่ตรง ...
Coderer

3
หากคุณบอกว่าgrep  -A9999  -B9999 regexมันจะแสดงทุกบรรทัดยกเว้นว่าคุณมี 10,000 บรรทัดที่ไม่ตรงกันในหนึ่งแถว ใช้สิ่งที่ต้องการGREP_COLORS="ms=31:sl=33:cx=32" grep -A9999 -B9999 SEVEREแสดงคำเป็นSEVEREสีแดงส่วนที่เหลือของเส้น SEVERE เป็นสีเหลืองและบรรทัดอื่น ๆ (ไม่ใช่ SEVERE) (ไม่เกิน 9999) เป็นสีเขียว
G-Man

คุณอาจต้องส่งผ่าน--color=alwaysไปยัง grep แทนที่จะเป็นเพียงแค่--colorขึ้นอยู่กับคำสั่งของท่อของคุณ แต่ใช่งานนี้ tail (GNU coreutils) 8.27 ติดตั้งในกล่องของฉัน
Hank Schultz

7

หากต้องการรับเอาต์พุตสีจากคำสั่งมาตรฐานเช่นgrepคุณควรตั้งค่านี้aliasใน.bashrc

# User specific aliases and functions
alias grep='grep --color=auto'

เมื่อคุณ grep บางอย่างในไฟล์ของคุณคุณเห็นสิ่งนี้ (แต่อาจเป็นสีแดง):

[root @ linuxbox mydir] # grep "\ (INFO \ | SEVERE \)" / var / log / logname
รายการนี้เป็นINFO  
SEVEREรายการนี้เป็นการเตือน!
รายการนี้เป็นINFO 
รายการนี้เป็นINFO 
SEVEREรายการนี้เตือน!

หากต้องการใช้tailหรือawkต้องการให้สีอยู่รอดในไพพ์นามแฝงนั้นไม่เพียงพอและคุณควรใช้--color=alwaysพารามิเตอร์เช่น:

[root @ linubox mydir] # grep --color = always "\ (INFO \ | SEVERE \)" / var / log / logname | หาง -f | awk '{พิมพ์ $ 1}'
นี้ 
รุนแรง
นี้
นี้
รุนแรง

หากคุณต้องการข้อความสีที่มีawkเนื้อเรื่องซับซ้อนเล็กน้อย แต่มีประสิทธิภาพมากกว่าตัวอย่างเช่น

[root @ linubox mydir] # tail -f / var / log / messages | awk '{if ($ 5 ~ / INFO /) พิมพ์ "\ 033 [1; 32m" $ 0 "\ 033 [0m"; อื่นถ้า ($ 1 ~ / SEVERE /) พิมพ์ "\ 033 [1; 31m" $ 0 "\ 033 [0m"; อื่นพิมพ์ $ 0} '
รายการนี้เป็นINFO  
SEVERE รายการนี้เป็นการเตือน!
นี่เป็นอีกหนึ่งรายการ
รายการนี้เป็นข้อมูล
นี่เป็นอีกหนึ่งรายการ
รายการนี้เป็น INFO 
SEVERE รายการนี้เป็นการเตือน!

แต่ละบรรทัดมีสีของมันเอง

มีวิธีอื่น ๆ อีกมากมายในการรับข้อความ colorized จาก shell ด้วยเครื่องมืออื่นและพวกเขาก็อธิบายอย่างดีจากสมาชิกคนอื่น ๆ



6

จากคำตอบ @uloBasEI ฉันได้ลองใช้... | perl ... | perl ...แล้วแต่ทว่าลินุกซ์ก็บ้าไปแล้วและก็ช้าเกินไป ถ้าฉันวางกฎทั้งหมดไว้ในperlคำสั่งเดียวมันก็ใช้ได้ดี

ตัวอย่างเช่นสร้างperlไฟล์colorTail.plดังนี้:

#!/usr/bin/perl -w

while(<STDIN>) {
    my $line = $_;
    chomp($line);
    for($line){
        s/==>.*<==/\e[1;44m$&\e[0m/gi; #tail multiples files name in blue background
        s/.*exception.*|at .*/\e[0;31m$&\e[0m/gi;  #java errors & stacktraces in red
        s/info.*/\e[1;32m$&\e[0m/gi; #info replacement in green
        s/warning.*/\e[1;33m$&\e[0m/gi; #warning replacement in yellow
    }
    print $line, "\n";
}

ใช้เป็น:

tail -f *.log | perl colorTail.pl
tail -f *.log -f **/*.log | perl colorTail.pl

หมายเหตุ: คุณสามารถใช้กับMobaXTerm ได้เช่นกัน! เพียงดาวน์โหลดperlปลั๊กอินจากไซต์MobaXTerm


3
tail -f /var/log/logname | source-highlight -f esc -s log

7
source-highlightไม่ใช่คำสั่งที่ได้รับการติดตั้งอย่างกว้างขวางดังนั้นอย่างน้อยคุณควรให้ลิงค์ไปยังไซต์โครงการ
Gilles

มีจำหน่ายใน Fedora 19.
sjas

และ Ubuntu 12.10
sjas

มันดูดี มันเป็นแพคเกจขนาดใหญ่เมื่อเทียบกับคนอื่น ๆ ในรายการนี้ (26MB) รองรับรายการภาษาจำนวนมาก สามารถปรับแต่งแก้ไขไฟล์ปรับแต่งได้ที่: /usr/share/source-highlight/*.lang (Ubuntu) หากคุณต้องการอะไรที่ง่ายไปกับ ccze หรือ colortail
lepe

ดูเหมือนว่ามันขึ้นอยู่กับการเพิ่มซึ่งอยู่ที่ประมาณ 462MB
ecsos

3

ทางออกหนึ่งที่ใช้ได้กับการระบายสีข้อความทุกประเภทไม่เพียงแค่ล็อกไฟล์คือเครื่องมือ Python หรือ ' colout '

pip install colout
myprocess | colout REGEX_WITH_GROUPS color1,color2... [attr1,attr2...]

ตำแหน่งที่ข้อความใด ๆ ในผลลัพธ์ของ 'myprocess' ซึ่งตรงกับกลุ่มที่ 1 ของ regex จะมีสีด้วย color1, กลุ่ม 2 ที่มี color2 เป็นต้น

ตัวอย่างเช่น:

tail -f /var/log/mylogfile | colout '^(\w+ \d+ [\d:]+)|(\w+\.py:\d+ .+\(\)): (.+)$' white,black,cyan bold,bold,normal

เช่นกลุ่ม regex แรก (parens) ตรงกับวันที่เริ่มต้นใน logfile กลุ่มที่สองตรงกับชื่อไฟล์ไพ ธ อนหมายเลขบรรทัดและชื่อฟังก์ชั่นและกลุ่มที่สามตรงกับข้อความบันทึกที่เกิดขึ้นหลังจากนั้น ดูเหมือนว่า:

logfile ด้วยการจัดรูปแบบสี

โปรดทราบว่าเส้นหรือส่วนต่าง ๆ ของบรรทัดที่ไม่ตรงกับ regex ใด ๆ ของฉันยังคงดังก้องดังนั้นนี่จึงไม่เหมือนกับ 'grep --color' - ไม่มีการกรองสิ่งใดออกจากเอาต์พุต

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


1
ฉันไม่ได้เห็นคำตอบเดียวที่แก้ไขไฟล์บันทึกซอร์ส
Dani_l

@Dani_l ใช่แล้ว! ในขณะที่ฉันเขียนสิ่งนี้ฉันต้องสับสนตัวเองโดยการพลิกกลับไปกลับมาระหว่างคำถามนี้กับคำถามที่คล้ายกันซึ่งคำตอบหลายข้อเกี่ยวกับวิธีกำหนดค่าการบันทึกซึ่งอักขระ ANSI ถูกเขียนลงในไฟล์บันทึกโดยตรง ฉันจะลบคำร้องเรียนนั้นออกจากคำตอบของฉัน
Jonathan Hartley

2

ปลั๊กไร้ยางอาย: ฉันเขียนเครื่องมือที่ชื่อว่าTxtStyleซึ่งทำสิ่งที่คล้ายกับตัวเลือกที่กล่าวถึงก่อนหน้านี้ คุณสามารถเรียกใช้ดังนี้

tail -f /var/log/syslog | txts --regex '\d+'

คุณยังสามารถกำหนดสไตล์ที่มีชื่อในไฟล์กำหนดค่า ( ~/.txts.conf) และใช้งานได้ตามต้องการ:

ifconfig | txts --name ifconfig

( ifconfigสไตล์ถูกกำหนดนอกกรอบ)


2

GRC แน่นอน!

ปรับแต่ง collors ของคุณด้วย regex ในไฟล์: ~ .grc / conf.tail (หรือชื่ออะไรก็ได้ที่คุณต้องการ)

regexp=.*(select .*)$
colours=unchanged,cyan
=====
regexp=.*(update .*)$
colours=unchanged,bold yellow
=====
regexp=.*(insert .*)$
colours=unchanged,bold yellow
=====
regexp=.*(emp=\d+).*
colours=unchanged,reverse green
=====
regexp=.*http.*/rest/contahub.cmds.(.*?)/(\w*).*$
colours=unchanged,green,magenta
=====
regexp=.*http.*/M/.*\.(.*?Facade)/(\w*).*$
colours=unchanged,underline green,underline magenta

บรรทัดคำสั่ง:

grc -c conf.tail tail -f log/tomcat/catalina.out

ผล: ภาพหน้าจอ

ข้อมูลสำหรับการกำหนดค่า grc: https://github.com/manjuraj/config/blob/master/.grc/sample.conf


1

ฉันเขียนฟังก์ชันทุบตีที่ยอมรับพารามิเตอร์มากถึงสามตัวและทำตัวกรอง grep คล้ายกับไฟล์ข้อความและส่งข้อความไปยังหน้าจอสี

ฉันต้องการเห็นฟังก์ชันหางที่จะทำเช่นนี้ แต่ยังไม่พบ

ฟังก์ชั่นนี้สามารถปรับปรุงได้ - ฉันขอขอบคุณสำหรับความช่วยเหลือในการทำให้ดีขึ้น

function multigrep(){

    #THIS WORKS - Recreate this, using input parameters
    #sed -En '/(App)|(Spe)/p' ./flashlog.txt;

    filename="/Users/stevewarren/Library/Preferences/Macromedia/Flash\ Player/Logs/flashlog.txt";
    paramString="";

    for element in "$@"
        do
            #echo $element;
            paramString="$paramString($element)|";
        done

    #TRIM FINAL | OFF PARAMSTRING
    paramString=${paramString:0:${#paramString}-1};

    #CREATE SED EXPRESSION - '/($1)|($2)|(...)/p'
    paramString="'/$paramString/p'";

    #CREATE SED FUNCTION, CALL ON FILE
    paramString="sed -En $paramString ./flashlog.txt"

    echo $paramString;
    echo "${txtbld}$(tput setaf 7)" > ./flashlog_output.txt;
    eval $paramString >> ./flashlog_output.txt;
    echo >> ./flashlog_output.txt;
    #cat ./flashlog_output.txt;

    cat ./flashlog_output.txt | while read LINE
    do

        [[  $1 && ${1-x} ]] && 
            if grep -q $1 <<<$LINE; then
                echo "$(tput setaf 3)$LINE"
            fi

        [[  $2 && ${2-x} ]] && 
            if grep -q $2 <<<$LINE; then
                echo "$(tput setaf 7)$LINE"
            fi


        [[  $3 && ${3-x} ]] && 
            if grep -q $3 <<<$LINE; then
                echo "$(tput setaf 6)$LINE"
            fi

    done
}

1

แน่นอน!

ฉันเขียนฟังก์ชั่นที่เรียกว่า "egrepi" เป็นเวลานานโดยยึดตามนิยามตัวแปรสี 8 ประการ ใช้งานได้กับ piped เท่านั้นเช่นฟังก์ชันสี "tail -f"

1. setColors

ก่อนฟังก์ชั่นตัวแปรสีที่จะเรียกว่าที่แรก:


setColors ()
{
set -a
which printf >/dev/null 2>&1 && print=printf || print=print # Mandriva doesn't know about printf

hide='eval tput civis'
show='eval tput cnorm'
CLS=$(tput clear)
bel=$(tput bel)

case ${UNAME} in
AIX)
# text / foreground
N=$(${print} '\033[1;30m')
n=$(${print} '\033[0;30m')
R=$(${print} '\033[1;31m')
r=$(${print} '\033[0;31m')
G=$(${print} '\033[1;32m')
g=$(${print} '\033[0;32m')
Y=$(${print} '\033[1;33m')
y=$(${print} '\033[0;33m')
B=$(${print} '\033[1;34m')
b=$(${print} '\033[0;34m')
M=$(${print} '\033[1;35m')
m=$(${print} '\033[0;35m')
C=$(${print} '\033[1;36m')
c=$(${print} '\033[0;36m')
W=$(${print} '\033[1;37m')
w=$(${print} '\033[0;37m')
END=$(${print} '\033[0m')

# background
RN=$(${print} '\033[6;40m')
Rn=$(${print} '\033[40m')
RR=$(${print} '\033[6;41m')
Rr=$(${print} '\033[41m')
RG=$(${print} '\033[6;42m')
Rg=$(${print} '\033[42m')
RY=$(${print} '\033[6;43m')
Ry=$(${print} '\033[43m')
RB=$(${print} '\033[6;44m')
Rb=$(${print} '\033[44m')
RM=$(${print} '\033[6;45m')
Rm=$(${print} '\033[45m')
RC=$(${print} '\033[6;46m')
Rc=$(${print} '\033[46m')
RW=$(${print} '\033[6;47m')
Rw=$(${print} '\033[47m')

HIGH=$(tput bold)
SMUL=$(tput smul)
RMUL=$(tput rmul)
BLINK=$(tput blink)
REVERSE=$(tput smso)
REVERSO=$(tput rmso)
;;
*)
# text / foreground
n=$(tput setaf 0)
r=$(tput setaf 1)
g=$(tput setaf 2)
y=$(tput setaf 3)
b=$(tput setaf 4)
m=$(tput setaf 5)
c=$(tput setaf 6)
w=$(tput setaf 7)
N=$(tput setaf 8)
R=$(tput setaf 9)
G=$(tput setaf 10)
Y=$(tput setaf 11)
B=$(tput setaf 12)
M=$(tput setaf 13)
C=$(tput setaf 14)
W=$(tput setaf 15)
END=$(tput sgr0)

HIGH=$(tput bold)
SMUL=$(tput smul)
RMUL=$(tput rmul)
BLINK=$(tput blink)
REVERSE=$(tput smso)
REVERSO=$(tput rmso)

# background
Rn=$(tput setab 0)
Rr=$(tput setab 1)
Rg=$(tput setab 2)
Ry=$(tput setab 3)
Rb=$(tput setab 4)
Rm=$(tput setab 5)
Rc=$(tput setab 6)
Rw=$(tput setab 7)
RN=$(tput setab 8)
RR=$(tput setab 9)
RG=$(tput setab 10)
RY=$(tput setab 11)
RB=$(tput setab 12)
RM=$(tput setab 13)
RC=$(tput setab 14)
RW=$(tput setab 15)
;;
esac

BLUEf=${B}
BLUE=${b}
REDf=${R}
RED=${r}
GREENf=${G}
GREEN=${g}
YELLOWf=${Y}
YELLOW=${y}
MANGENTAf=${M}
MANGENTA=${m}
WHITEf=${W}
WHITE=${w}
CYANf=${C}
CYAN=${c}

OK="${RG}${n}OK${END}"
KO="${RR}${n}KO${END}"
NA="${N}NA${END}"

COLORIZE='eval sed -e "s/{END}/${END}/g" -e "s/{HIGH}/${HIGH}/g" -e "s/{SMUL}/${SMUL}/g" -e "s/{RMUL}/${RMUL}/g" -e "s/{BLINK}/${BLINK}/g" -e "s/{REVERSE}/${REVERSE}/g" -e "s/{REVERSO}/${REVERSO}/g"'
LOWS=' -e "s/{n}/${n}/g" -e "s/{r}/${r}/g" -e "s/{g}/${g}/g" -e "s/{y}/${y}/g" -e "s/{b}/${b}/g" -e "s/{m}/${m}/g" -e "s/{c}/${c}/g" -e "s/{w}/${w}/g"'
HIGHS=' -e "s/{N}/${N}/g" -e "s/{R}/${R}/g" -e "s/{G}/${G}/g" -e "s/{Y}/${Y}/g" -e "s/{B}/${B}/g" -e "s/{M}/${M}/g" -e "s/{C}/${C}/g" -e "s/{W}/${W}/g"'
REVLOWS=' -e "s/{Rn}/${Rn}/g" -e "s/{Rr}/${Rr}/g" -e "s/{Rg}/${Rg}/g" -e "s/{Ry}/${Ry}/g" -e "s/{Rb}/${Rb}/g" -e "s/{Rm}/${Rm}/g" -e "s/{Rc}/${Rc}/g" -e "s/{Rw}/${Rw}/g"'
REVHIGHS=' -e "s/{RN}/${RN}/g" -e "s/{RR}/${RR}/g" -e "s/{RG}/${RG}/g" -e "s/{RY}/${RY}/g" -e "s/{RB}/${RB}/g" -e "s/{RM}/${RM}/g" -e "s/{RC}/${RC}/g" -e "s/{RW}/${RW}/g"'
# COLORIZE Usage:
# command |${COLORIZE} ${LOWS} ${HIGHS} ${REVLOWS} ${REVHIGHS}

set +a
}

2. egrepi

และฟังก์ชั่น egrepi ที่มีประสิทธิภาพและสวยงาม: การปั่นสีระหว่าง 8 สีขึ้นไป (ความต้องการของคุณ) และทดสอบภายใต้ระบบปฏิบัติการยูนิกซ์ 3 ระบบที่แตกต่างกันพร้อมความคิดเห็น:


# egrepi() egrep with 8 REVERSE cyclic colorations on regexps almost like egrep
# egrepi 
# current script will work for KSH88, KSH93, bash 2+, zsh, under AIX / Linux / SunOS
egrepi ()
{
args=$*
# colorList=wBcgymrN                                                # KSH93 or bash 3+, not for AIX
# set -A color                                                  # needed with older sh
color[0]=$Rw; color[1]=$RB; color[2]=$Rc; color[3]=$Rg; color[4]=$Ry; color[5]=$Rm; color[6]=$Rr; color[7]=$RN; # this is the only one AIX solution
i=0
unset argsToGrep argsSedColor argsPerlColor

for arg in ${args}
do
    [ "${arg}" == "." ] && arg=\\.                              # if you wanna grep "."
    # color=R${colorList:((${RANDOM: -1:1})):1}                     # bash RANDOMized colors
    # color=R${colorList:$i:1} && let i++ && ((i==8)) && i=0                # KSH93 or bash 3+, not for AIX
    argsToGrep="${argsToGrep}${argsToGrep:+|}${arg}"
    # argsSedColor="${argsSedColor} -e s#${arg}#$n${!color}&${w}#gI"            # AIX KSH88 do not recognise this fucking variable double expansion
    # argsSedColor="${argsSedColor} -e s#${arg}#$n${color[$i]}&${w}#gI"         # AIX neither do include sed with Ignore case
    argsPerlColor="${argsPerlColor}${argsPerlColor:+,}s#${arg}#$n${color[$i]}$&${END}#gi"   # So: gotta use perl
    let i+=1 && ((i==8)) && i=0                             # AIX KSH88 do not recognise "let i++"
done
# egrep -i "${argsToGrep}" | sed ${argsSedColor} | egrep -v "grep|sed"              # AIX sed incompatibility with Ignore case
# (($# > 0)) && (egrep -i "${argsToGrep}" | perl -p -e ${argsPerlColor}) || cat         # this line colors & grep the words, will NOT act as "tail -f"
(($# > 0)) && (perl -p -e ${argsPerlColor}) || cat                      # this line just colors the words
}

3. การใช้งาน

คำสั่ง | egrepi word1 .. wordN



1

สำหรับรหัสสีฉันจะใช้ tput:

red=$( tput -Txterm setaf 1 )
norm=$( tput -Txterm sgr0 )
bold=$( tput -Txterm bold )

ดูการอ้างอิง: man tput

แล้ว:

tail -F myfile.log | sed "s/\(.ERROR.*\)/$red$bold\1$norm/g"

เยี่ยมมากขอบคุณ ทำงานเหมือนจับใจกับฟังก์ชั่นเชลล์มาตรฐาน
vquintans

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