วิธีการสีคอลัมน์ออกของ ls?


8

ชนิดชื่อกล่าวว่ามันทั้งหมด: ผมอยากจะได้รับบรรดาคอลัมน์สีเรียบร้อยของการส่งออกของบางอย่างเช่นls -alการพูดในขณะที่คำตอบของ 10basetomเพื่อคำถามนี้

สกรีนช็อตของข้อมูลโค้ดที่เน้นทางไวยากรณ์จากคำตอบที่เชื่อมโยง


นี่เป็นความคิดที่เรียบร้อย! แต่คุณใช้ระบบปฏิบัติการอะไรอยู่
JakeGould

2
ที่ดูเหมือนจะ (ไม่ถูกต้อง) Bash เน้นไวยากรณ์โดยซอฟต์แวร์ SE ดูเหมือนว่ามันจะไม่ได้ระบายสีตามคอลัมน์ แต่จะเป็นตัวเลข (ตัวเลข) เป็นหนึ่งสีและทุกอย่างที่เริ่มต้นด้วยตัวพิมพ์ใหญ่จะได้สีอื่น การระบายสีต่อคอลัมน์สามารถทำได้ แต่ค่อนข้างแตกต่างกัน
Bob

3
ในความหมายทั่วไปคุณสามารถแยกเอาท์พุทคั่นคอลัมน์ด้วยsedหรือawkและแทรกลำดับหนี ANSI
บ๊อบ

เกี่ยวข้อง: superuser.com/q/665274
Tyson

ฉันบนวินโดวส์ 10 Ubuntu ระบบย่อย แต่เปลี่ยนไป MacOS (ที่ได้รับภัยพิบัติที่สมบูรณ์แบบที่ WinX เปิดออกมาเป็น ... )
Pirx

คำตอบ:


8

นี้เป็น doable awkกับ น่าเสียดายเนื่องจากรูปแบบของls -lไม่ได้ระบุจึงไม่สามารถหาวิธีแก้ปัญหาที่จะทำงานกับทุกระบบดังนั้นการปรับสีที่ใช้สำหรับคอลัมน์ใดที่จำเป็นสำหรับบางระบบ


ls -lปิดแรกเราต้องการที่จะรักษาพื้นที่เดิมที่ใช้โดย มิฉะนั้นการจัดแนวคอลัมน์จะไม่ถูกต้อง เราสามารถทำได้ด้วยFPATตัวเลือกด้วยคำตอบ SO นี้ :

ls -la | awk '
    BEGIN {
        FPAT = "([[:space:]]*[^[:space:]]+)";
        OFS = "";
    }

ในawkแต่ละพารามิเตอร์ตำแหน่ง ( $1, $2ฯลฯ ) หมายถึงหนึ่งฟิลด์เช่นหนึ่งคอลัมน์ในแถวปัจจุบัน สิ่งที่FPATตัวเลือกด้านบนทำคือกำหนดใหม่แต่ละฟิลด์เพื่อรวมช่องว่างก่อนหน้าทั้งหมดดังนั้นเมื่อคุณprintกลับออกมาช่องว่างดังกล่าวจะทำให้คอลัมน์อยู่ในตำแหน่งเดียวกัน

ตอนนี้เราสามารถแก้ไขแต่ละฟิลด์เพื่อใส่รหัสสีแล้วพิมพ์ผลลัพธ์ที่แก้ไขได้:

    {
        $2 = "\033[31m" $2 "\033[0m";
        $3 = "\033[36m" $3 "\033[0m";
        $4 = "\033[36m" $4 "\033[0m";
        $5 = "\033[31m" $5 "\033[0m";
        $6 = "\033[36m" $6 "\033[0m";
        $7 = "\033[36m" $7 "\033[0m";
        $8 = "\033[31m" $8 "\033[0m";
        print
    }
'

โปรดสังเกตว่าแต่ละคอลัมน์จะถูกรีเซ็ตกลับไปเป็นค่าเริ่มต้น ( 0ระหว่าง[และถึงm) หลังจากนั้น หากคุณต้องการให้สีวิ่งข้ามหลาย ๆ คอลัมน์คุณสามารถละเว้นรหัสนั้นได้ ส่วนตัวผมชอบที่จะระบุแต่ละคอลัมน์อย่างอิสระ


.bashrcคุณสามารถกำหนดคำสั่งที่นำมาใช้ใหม่ในของคุณ ตัวอย่างเช่น:

lsc() {
    ls -la | awk '
        BEGIN {
            FPAT = "([[:space:]]*[^[:space:]]+)";
            OFS = "";
        }
        {
            $2 = "\033[31m" $2 "\033[0m";
            $3 = "\033[36m" $3 "\033[0m";
            $4 = "\033[36m" $4 "\033[0m";
            $5 = "\033[31m" $5 "\033[0m";
            $6 = "\033[36m" $6 "\033[0m";
            $7 = "\033[36m" $7 "\033[0m";
            $8 = "\033[31m" $8 "\033[0m";
            print
        }
    '
}

คุณอาจต้องรีสตาร์ทbashเซสชัน (หรือเรียกใช้source ~/.bashrc) เพื่อให้คำจำกัดความฟังก์ชั่นนี้ทำงาน

จากที่นี่คุณสามารถโทรlscได้ซึ่งควรให้ผลลัพธ์ที่คุณต้องการ:

สกรีนช็อตของเอาต์พุตสี


พวกมันยอดเยี่ยมเกือบเป็นสิ่งที่ฉันต้องการ ;-) อย่างจริงจัง แต่ฉันต้องการเพิ่มอีกหนึ่งบิดและมีชื่อไฟล์สี ls -al --color = auto จะทำเช่นนั้น แต่ถ้าฉันเพิ่มตัวเลือก --color ลงในโซลูชันด้านบนรหัสสีดูเหมือนจะถูกปล้น เราจะได้รับ awk เพื่อให้เหล่านั้นหรือไม่
Pirx

ความคิดเห็นที่สองนี่เป็นความอยากรู้มากกว่านี้: ในคำตอบที่ฉันอ้างอิงในคำถามเดิมของฉันดูเหมือนว่า 10basetom ไม่ได้ใช้ข้อใดข้อหนึ่งข้างต้นและยังมีคอลัมน์สีอยู่ ฉันสงสัยว่าเป็นเพราะเขาใช้ ls รุ่นอื่นหรือเทอร์มินัลอัจฉริยะบางตัวหรือไม่
Pirx

@Pirx การระบายสีในคำตอบนั้นถูกใช้โดยซอฟต์แวร์ Stack Exchange มันไม่ได้มาจากสถานีของพวกเขา เป็นเพียงเพราะผลลัพธ์ถูกวางในบล็อกโค้ดและคำถามมีแท็กbashซึ่งพยายามใช้ไวยากรณ์ Bash ที่เน้นสีโดยอัตโนมัติกับแท็กรหัสใด ๆ ในคำถามและคำตอบ ... ซึ่งจริง ๆ แล้วไม่ถูกต้องในกรณีนี้ เหตุผลเดียวกันสายอักขระในรหัสเป็นสีแดงในคำตอบของฉันแม้ว่าฉันจะไม่ได้ตั้งใจทำสีก็ตาม
บ๊อบ

1
@Pirx --color=alwaysใช้ ตราบใดที่คุณไม่ได้ใช้สีที่แตกต่างกันในคอลัมน์ชื่อไฟล์ ( $9ในตัวอย่างของฉัน) awkควรผ่านพวกเขาไป
บ๊อบ

บันทึก @Pirx ด้านข้าง--color=alwaysเป็นส่วนขยายของ GNU ดังนั้นหากคุณบนระบบที่ไม่ใช่ของกนู (เช่น MacOS, BSDs อื่น ๆ ) คุณจะต้องติดตั้งอย่างใดอย่างหนึ่งรุ่น GNU หรือใช้ทางเลือก
บ๊อบ

6

วิธีนี้จะพิมพ์คอลัมน์ที่สองของls -alFสีแดงคอลัมน์ที่สามถึงแปดในสีน้ำเงินและคอลัมน์ที่เก้าเป็นสีดำ:

ls -alF | awk -v black=$(tput setaf 0) -v red=$(tput setaf 1) -v blue=$(tput setaf 4) '{$2=red $2; $3= blue $3; $9=black $9} 1'

นี่เป็นเพียงตัวอย่าง คุณสามารถปรับแต่งสิ่งนี้ให้สอดคล้องกับเนื้อหาในหัวใจของคุณ

สำหรับผู้ที่ต้องการรหัสของพวกเขากระจายออกไปหลายบรรทัด:

ls -alF | awk -v black=$(tput setaf 0) \
    -v red=$(tput setaf 1) \
    -v blue=$(tput setaf 4) \
    '{
        $2=red $2
        $3= blue $3
        $9=black $9
     }

     1'

รายละเอียด

tputเป็นเครื่องมือในการสร้างรหัสควบคุมที่หลากหลายสำหรับเทอร์มินัลของคุณ ตัวอย่างเช่น tput setaf nตั้งค่าสีพื้นหน้าเป็นnตำแหน่งnตั้งแต่ 0 ถึง 7

0  Black
1  Red
2  Green
3  Yellow
4  Blue
5  Magenta
6  Cyan
7  White

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับtputความสามารถและสีของมันนี่

รหัส awk กำหนดตัวแปรblack, redและblueที่มีรหัสขั้วสีดำ, สีแดง, สีฟ้าและตามลำดับ รหัสเหล่านี้จะถูกวางไว้ที่จุดเริ่มต้นของคอลัมน์ใดก็ตามที่เราต้องการให้สี

เคล็ดลับอย่างหนึ่งคือรหัสสีไม่ได้รีเซ็ตด้วยตนเอง ดังนั้นสีสุดท้ายที่คุณระบุในหนึ่งบรรทัดจะเป็นเช่นไรเว้นแต่ว่ามีการระบุคำสั่งสีอื่นเป็นสีเริ่มต้นสำหรับบรรทัดถัดไป


1
ดีโทรดีในการกำหนดตัวแปร ไม่ทราบว่าคุณสามารถทำได้จากภายในawk! ฉันขอแนะนำให้คุณรวมรูปแบบเพื่อรักษาแนวคอลัมน์ด้วยเช่นกัน :)
บ๊อบ

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