การสลับสีทำได้โดยใช้ลำดับการหลีกเลี่ยงที่ฝังอยู่ในข้อความ โปรแกรมมักจะออก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ใช่มั้ย