การสลับสีทำได้โดยใช้ลำดับการหลีกเลี่ยงที่ฝังอยู่ในข้อความ โปรแกรมมักจะออกANSI escape sequencesเนื่องจากนั่นคือสิ่งที่เทอร์มินัลทั้งหมดรองรับในปัจจุบัน
ลำดับการหลบหนีเพื่อเปลี่ยนสีพื้นหน้าเป็นสีแดงคือ\e[31m
ซึ่ง\e
กำหนดอักขระการหลีกเลี่ยง (ฐานแปด 033 เลขฐานสิบหก 1b หรือที่เรียกว่า ESC ^[
และชื่ออื่น ๆ อีกมากมาย) ตัวเลขในช่วง 30–39 ตั้งค่าสีพื้นหน้า หมายเลขอื่นตั้งค่าคุณลักษณะที่แตกต่าง \e[0m
รีเซ็ตแอตทริบิวต์ทั้งหมดเป็นค่าเริ่มต้น เรียกใช้cat -v
เพื่อตรวจสอบว่าโปรแกรมพิมพ์ออกมาอย่างไรมันอาจใช้ตัวแปรบางตัวเช่น\e[0;31m
เพื่อรีเซ็ตคุณสมบัติทั้งหมดเป็นครั้งแรกหรือ\e[3;31
เพื่อเปิดใช้ตัวเอียง (ซึ่งเทอร์มินัลจำนวนมากไม่รองรับ)
ใน ksh, bash หรือ zsh, คุณสามารถใช้$'…'
เพื่อเปิดใช้งานเครื่องหมายแบคสแลชที่อยู่ในเครื่องหมายคำพูด, ซึ่งช่วยให้คุณพิมพ์$'\e'
เพื่อรับอักขระ escape โปรดทราบว่าคุณจะต้องเป็นสองเท่าทับขวาใด ๆ grep
ที่คุณต้องการที่จะส่งผ่านไปยัง ใน/bin/sh
คุณสามารถใช้"$(printf \\e)"
หรือพิมพ์ตัวอักษรยกเว้นตัวอักษร
ด้วยgrep -o
ตัวเลือกGNU ข้อมูลโค้ดต่อไปนี้จะกรองข้อความสีแดงโดยสันนิษฐานว่ามันเริ่มต้นด้วยลำดับการหลบหนี\e[31m
ลงท้ายด้วยตัวใดตัวหนึ่ง\e[0m
หรือ\e[30m
ในบรรทัดเดียวกันและไม่มีลำดับ escape แบบฝัง
grep -Eo $'\e\\[31m[^\e]*\e\\[[03]?m'
awk
ตัวอย่างต่อไปนี้จะแยกข้อความสีแดงแม้ว่าจะเป็นหลายบรรทัดก็ตาม
awk -v RS='\033' '
match($0, /^\[[0-9;]*m/) {
color = ";" substr($0, 2, RLENGTH-2) ";";
$0 = substr($0, RLENGTH+1);
gsub(/(^|;)0*[^03;][0-9]*($|;)/, ";", color);
red = (color ~ /1;*$/)
}
red'
นี่คือรูปแบบที่ยังคงคำสั่งเปลี่ยนสีซึ่งอาจเป็นประโยชน์หากคุณกรองหลายสี (ที่นี่เป็นสีแดงและสีม่วงแดง)
awk -v RS='\033' '
match($0, /^\[[0-9;]*m/) {
color = ";" substr($0, 2, RLENGTH-2) ";";
printf "\033%s", substr($0, 1, RLENGTH);
$0 = substr($0, RLENGTH+1);
gsub(/(^|;)0*[^03;][0-9]*($|;)/, ";", color);
desired = (color ~ /[15];*$/)
}
desired'
>&1
? ฉันหมายความว่าสิ่งสีแดงจะไม่หายไปถ้าคุณ2>/dev/null
ใช่มั้ย