bash: tô màu cột thứ hai của đầu ra


8

giả sử, tôi có đầu ra sau từ ls:

$ ls -lAhF /bin
-rwxr-xr-x 1 root root 905K Apr 10  2010 bash*
-rwxr-xr-x 3 root root  31K Dec 26  2011 bunzip2*
-rwxr-xr-x 1 root root 505K Nov 15  2010 busybox*
-rwxr-xr-x 3 root root  31K Dec 26  2011 bzcat*
lrwxrwxrwx 1 root root    6 Jun 24  2012 bzcmp -> bzdiff*
...

Tôi đang tìm cách, làm thế nào tôi có thể tô màu cột thứ hai. Tôi biết cách sử dụng sed để tô màu cho bất kỳ mẫu nào, nhưng tôi không biết cách tô màu cho cột cụ thể. Về cơ bản, tôi cần chèn '\033[0;31m'sau khoảng '\033[0m'trắng đầu tiên và phía trước không gian thứ hai. Hoặc có lẽ có cách thanh lịch hơn nhiều?


1
xấu xí:ls --color -l | sed -e $'s/ *[^ ]* /\033[0;31m&\033[0m/'
frostschutz

Câu trả lời:


10

Với GNU grepđược cung cấp, nó đã được xây dựng với sự hỗ trợ của PCRE :

ls -l | GREP_COLORS='mt=1;41;37' grep --color -P '^\S+\s+\K\S+'

Với sed:

on=$(tput setaf 7; tput setab 1; tput bold) off=$(tput sgr0)
ls -l | sed "s/[^[:blank:]]\{1,\}/$on&$off/2"

Lưu ý rằng việc sử dụng setafgiả định thiết bị đầu cuối hỗ trợ các chuỗi thoát màu ANSI, do đó bạn cũng có thể mã hóa nó, điều này cũng sẽ làm cho nó ít dài dòng hơn. Ở đây với cú pháp ksh93(cũng bashzsh):

on=$'\e[1;47;37m' off=$'\e[m'

Để khái quát cho cột thứ n :

n=5

GREP_COLORS='mt=1;41;37' grep --color -P "^(\S+\s+){$(($n-1))}\K\S+"

sed "s/[^[:blank:]]\{1,\}/$on&$off/$n"

Người giới thiệu


grep -Pthật tuyệt vời Cảm ơn rất nhiều.
dùng1968963

6

Một cái gì đó như thế này?

awk -v on="$(tput bold)" -v off="$(tput rmso)" '{ $2=on $2 off }; 1'

Chỉnh sửa: sử dụng các tiểu ban thích hợp tput.


Cài đặt $1sẽ phá vỡ liên kết cột mặc dù.
Stéphane Chazelas

2
Nói đúng ra, rmsolà để hủy smsomặc dù (chế độ nổi bật), không phải bold. Trên nhiều thiết bị đầu cuối ( tput rmsokhông phải hủy bỏ tput bold).
Stéphane Chazelas
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.