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 .
sed
hoặc awk
chèn một chuỗi thoát ANSI .
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 .
sed
hoặc awk
chèn một chuỗi thoát ANSI .
Câu trả lời:
Đ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 -l
khô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 FPAT
tù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
,, $2
v.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ì FPAT
tù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 print
lù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 ( 0
giữa [
và 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 bash
phiê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:
--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 ( $9
trong ví dụ của tôi), awk
nên chuyển chúng qua.
Điều này sẽ in cột thứ hai ls -alF
mà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'
tput
là 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 n
nơi n
có 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ề tput
và khả năng màu sắc của nó ở đây .
Các biến định nghĩa đang awk black
, red
và blue
có 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.
awk
! Tôi khuyên bạn nên bao gồm mẫu để duy trì căn chỉnh cột quá :)
FPAT
thủ thuật của bạn để giữ khoảng cách chính xác.