bash: mewarnai kolom keluaran kedua

8

katakanlah, saya telah mengikuti keluaran dari 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*
...

Saya mencari cara, bagaimana saya bisa mewarnai kolom kedua. Saya tahu cara menggunakan sed untuk mewarnai pola apa pun, tapi saya tidak tahu cara mewarnai kolom tertentu. Pada dasarnya, saya perlu memasukkan '\033[0;31m'setelah ruang pertama dan '\033[0m'infront dari ruang kedua. Atau mungkin ada cara yang jauh lebih elegan?

pengguna1968963
sumber
1
jelek:ls --color -l | sed -e $'s/ *[^ ]* /\033[0;31m&\033[0m/'
frostschutz

Jawaban:

10

Dengan GNU grepasalkan telah dibangun dengan dukungan PCRE :

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

Dengan sed:

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

Perhatikan bahwa menggunakan setafasumsi terminal mendukung urutan pelarian warna ANSI, jadi Anda mungkin juga membuat kode yang sulit, yang akan membuatnya kurang bertele-tele juga. Di sini dengan sintaks ksh93(juga bashdan zsh):

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

Untuk menyamaratakan n th kolom:

n=5

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

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

Referensi

Stéphane Chazelas
sumber
grep -Pfantastis. Terima kasih banyak.
user1968963
6

Sesuatu seperti ini?

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

Sunting: gunakan tputsub perintah yang tepat .

tripleee
sumber
Pengaturan $1akan mematahkan perataan kolom.
Stéphane Chazelas
2
Sebenarnya, rmsoadalah membatalkan smsomeskipun (mode stand-out), bukan bold. Pada banyak terminal ( tput rmsotidak tidak membatalkan tput bold).
Stéphane Chazelas