Làm thế nào để tô màu cột đầu ra của ls?


8

Loại tiêu đề nói lên tất cả: Tôi muốn có được những cột màu gọn gàng của đầu ra của một cái gì đó như ls -al, như trong câu trả lời của 10basetom cho câu hỏi này .

Ảnh chụp màn hình của đoạn mã được tô sáng cú pháp từ câu trả lời được liên kết


Vâng, đây là một ý tưởng gọn gàng! Nhưng bạn đang dùng hệ điều hành nào?
JakeGould

2
Có vẻ như (không chính xác) cú pháp Bash được tô sáng bởi phần mềm SE. Có vẻ như nó không được tô màu theo cột mà thay vào đó là các chữ số (số) có một màu và bất cứ thứ gì bắt đầu bằng chữ hoa đều có màu khác. Tô màu trên mỗi cột là có thể làm được nhưng khá khác nhau.
Bob

3
Theo nghĩa chung, bạn có thể phân tách đầu ra trên các dấu tách cột bằng sedhoặc awkchèn một chuỗi thoát ANSI .
Bob


Tôi đang sử dụng hệ thống con Ubuntu của Windows 10, nhưng đang chuyển sang macOS (do thảm họa hoàn toàn mà WinX hóa ra là ...)
Pirx

Câu trả lời:


8

Điều này là có thể làm được với awk. Thật không may, vì định dạng của ls -lkhông được chỉ định, không thể đưa ra giải pháp sẽ hoạt động trên mọi hệ thống nên một số điều chỉnh màu nào sẽ được sử dụng cho cột nào sẽ cần thiết trên một số hệ thống.


Trước hết, chúng tôi muốn giữ lại các không gian ban đầu được sử dụng bởi ls -l. Nếu không, căn chỉnh cột sẽ không chính xác. Chúng ta có thể làm điều này với FPATtùy chọn, nhờ câu trả lời SO này :

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

Trong awk, mỗi tham số vị trí ( $1,, $2v.v.) đề cập đến một trường, tức là một cột trên hàng hiện tại. Những gì FPATtùy chọn ở trên đã xác định lại từng trường để bao gồm tất cả các khoảng trắng trước đó, vì vậy khi bạn printlùi ra, nó sẽ giữ các khoảng trắng để các cột giữ nguyên vị trí.

Bây giờ chúng ta chỉ cần chỉnh sửa từng trường để chèn mã màu , sau đó in đầu ra đã chỉnh sửa:

    {
        $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
    }
'

Lưu ý rằng mỗi cột được đặt lại về mặc định ( 0giữa [m) sau đó. Nếu bạn muốn màu chạy trên nhiều cột, bạn có thể bỏ qua mã đó. Cá nhân, tôi thích chỉ định từng cột một cách độc lập.


Bạn có thể xác định một lệnh tái sử dụng trong của bạn .bashrc. Ví dụ:

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
        }
    '
}

Bạn có thể cần phải khởi động lại bashphiên (hoặc chạy source ~/.bashrc) để định nghĩa hàm này chạy.

Từ đây, bạn chỉ có thể gọi lsc, sẽ cung cấp cho bạn đầu ra mà bạn mong muốn:

Ảnh chụp màn hình của đầu ra màu


Những người tuyệt vời, đây gần như là những gì tôi muốn ;-) Nghiêm túc mà nói, tôi muốn thêm một nút xoắn nữa và có tên tệp màu. ls -al --color = auto sẽ làm điều đó, nhưng nếu tôi chỉ thêm tùy chọn --color vào các giải pháp ở trên, mã màu dường như bị tước bỏ. Chúng ta có thể nhận được awk để giữ những người đó?
Pirx

Nhận xét thứ hai, điều này càng gây tò mò: Trong câu trả lời tôi đã tham khảo trong câu hỏi ban đầu của mình, có vẻ như 10basetom đã không sử dụng bất kỳ câu hỏi nào ở trên và vẫn có các cột màu. Tôi tự hỏi liệu đó có phải là vì anh ta đã sử dụng một phiên bản khác của ls, hoặc một thiết bị đầu cuối thông minh lạ mắt nào đó không?
Pirx

@Pirx Việc tô màu trong câu trả lời được áp dụng bởi phần mềm Stack Exchange. Nó không đến từ nhà ga của họ. Đó chỉ là do đầu ra được dán trong một khối mã và câu hỏi có thẻ bash , nó tự động cố gắng áp dụng cú pháp tô sáng Bash cho bất kỳ thẻ mã nào trong câu hỏi và câu trả lời ... thực sự không chính xác trong trường hợp này. Cùng một lý do các chuỗi trong mã có màu đỏ trong câu trả lời của tôi, mặc dù tôi không cố ý tô màu chúng.
Bob

1
@Pirx Sử dụng --color=always. Miễn là bạn không áp dụng các màu khác nhau cho cột tên tệp ( $9trong ví dụ của tôi), awknên chuyển chúng qua.
Bob

@Pirx Side note, --color=alwayslà một phần mở rộng GNU, vì vậy nếu bạn đang sử dụng hệ thống không phải GNU (ví dụ: macOS, các BSD khác), bạn sẽ cần phải cài đặt phiên bản GNU hoặc sử dụng một phiên bản thay thế .
Bob

6

Điều này sẽ in cột thứ hai ls -alFmàu đỏ, thứ ba đến thứ tám màu xanh lam và thứ chín màu đen:

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'

Đây chỉ là một ví dụ. Bạn có thể tùy chỉnh nội dung này theo nội dung trái tim của bạn.

Đối với những người thích mã của họ trải rộng trên nhiều dòng:

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'

Chi tiết

tputlà một tiện ích để tạo ra nhiều loại mã điều khiển cho thiết bị đầu cuối của bạn. Ví dụ: tput setaf nđặt màu nền trước thành nnơi ncó thể nằm trong khoảng từ 0 đến 7

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

Bạn có thể đọc thêm về tputvà khả năng màu sắc của nó ở đây .

Các biến định nghĩa đang awk black, redbluecó chứa các mã thiết bị đầu cuối cho màu đen, đỏ và xanh dương, tương ứng. Các mã này được đặt ở đầu của bất kỳ cột nào chúng ta muốn tô màu.

Một mẹo nhỏ là mã màu không tự thiết lập lại. Vì vậy, bất kể màu cuối cùng bạn chỉ định trên một dòng sẽ là gì, trừ khi lệnh màu khác được chỉ định, sẽ là màu mặc định cho dòng tiếp theo.


1
Huh, cuộc gọi tốt về việc xác định các biến. Không biết bạn có thể làm điều đó từ bên trong awk! Tôi khuyên bạn nên bao gồm mẫu để duy trì căn chỉnh cột quá :)
Bob

@Bob Và, tôi thích FPATthủ thuật của bạn để giữ khoảng cách chính xác.
John1024
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.