Bagaimana cara mewarnai kolom keluaran ls?

8

Judul jenis mengatakan itu semua: saya ingin mendapatkan orang-kolom berwarna rapi output dari sesuatu seperti ls -al, katakanlah, seperti dalam jawaban 10basetom ini untuk pertanyaan ini .

Cuplikan layar cuplikan kode yang disorot sintaksis dari jawaban tertaut

Pirx
sumber
Nah, ini ide yang rapi! Tapi OS apa yang Anda pakai?
JakeGould
2
Itu tampaknya (salah) Bash sintaks-disorot oleh perangkat lunak SE. Sepertinya itu tidak diwarnai oleh kolom tetapi digit (angka) mendapatkan satu warna dan apa pun yang dimulai dengan huruf besar mendapatkan yang lain. Pewarnaan per kolom bisa dilakukan tetapi agak berbeda.
Bob
3
Dalam pengertian umum, Anda dapat membagi output pada pemisah kolom dengan sedatau awkdan memasukkan urutan escape ANSI .
Bob
Terkait: superuser.com/q/665274
Tyson
Saya menggunakan subsistem Windows 10 Ubuntu, tetapi beralih ke macOS (mengingat bencana lengkap yang ternyata WinX menjadi ...)
Pirx

Jawaban:

8

Ini bisa dilakukan dengan awk. Sayangnya, karena format ls -ltidak ditentukan, tidak mungkin untuk menghasilkan solusi yang akan bekerja pada setiap sistem sehingga beberapa penyesuaian warna yang digunakan untuk kolom mana yang akan diperlukan pada beberapa sistem.


Pertama, kami ingin melestarikan ruang asli yang digunakan oleh ls -l. Kalau tidak, perataan kolom akan salah. Kita dapat melakukan ini dengan FPATopsi, berkat jawaban SO ini :

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

Dalam awk, setiap paramisional posisional ( $1,, $2dll.) Mengacu pada satu bidang, yaitu satu kolom pada baris saat ini. Apa yang dilakukan FPATopsi di atas adalah mendefinisikan kembali setiap bidang untuk memasukkan semua ruang sebelumnya, jadi ketika Anda printmundur itu membuat ruang sehingga kolom tetap di posisi yang sama.

Sekarang kita cukup mengedit setiap bidang untuk memasukkan kode warna , dan kemudian mencetak hasil yang diedit:

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

Perhatikan bahwa setiap kolom diatur ulang ke default ( 0antara [dan m) setelahnya. Jika Anda ingin warna berjalan di beberapa kolom, Anda dapat menghilangkan kode itu. Secara pribadi, saya lebih suka menentukan setiap kolom secara independen.


Anda dapat mendefinisikan perintah yang dapat digunakan kembali di .bashrc. Sebagai contoh:

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

Anda mungkin perlu memulai kembali bashsesi Anda (atau menjalankan source ~/.bashrc) agar definisi fungsi ini dapat berjalan.

Dari sini, Anda bisa menelepon lsc, yang akan memberi Anda output yang Anda inginkan:

Tangkapan layar keluaran berwarna

Bob
sumber
Keren kawan, ini hampir apa yang saya inginkan ;-) Serius, meskipun, saya ingin menambahkan satu sentuhan lagi dan memiliki nama file berwarna. ls -al --color = auto akan melakukan itu, tetapi jika saya hanya menambahkan opsi --color ke solusi di atas, kode warna tampaknya dilucuti. Bisakah kita canggung untuk menyimpannya?
Pirx
Komentar kedua, ini lebih karena penasaran: Dalam jawaban yang saya rujuk dalam pertanyaan asli saya, sepertinya 10basetom tidak menggunakan salah satu di atas, dan masih memiliki kolom berwarna. Aku ingin tahu apakah itu karena dia menggunakan versi ls yang berbeda, atau terminal pintar yang mewah?
Pirx
@ Pirx Pewarnaan dalam jawaban diterapkan oleh perangkat lunak Stack Exchange. Itu tidak datang dari terminal mereka. Itu hanya karena output disisipkan dalam blok kode dan pertanyaan memiliki tag bash , yang secara otomatis mencoba menerapkan penyorotan Bash ke setiap tag kode dalam pertanyaan dan jawaban ... yang sebenarnya tidak benar dalam kasus ini. Alasan yang sama string dalam kode merah dalam jawaban saya, meskipun saya tidak sengaja mewarnai mereka.
Bob
1
@Pirx Gunakan --color=always. Selama Anda tidak menerapkan warna berbeda ke kolom nama file ( $9dalam contoh saya), awkharus melewati mereka.
Bob
@Pirx Side note, --color=alwaysadalah ekstensi GNU jadi jika Anda menggunakan sistem non-GNU (mis. MacOS, BSD lainnya) Anda harus menginstal versi GNU atau menggunakan alternatif .
Bob
6

Ini akan mencetak kolom kedua ls -alFberwarna merah, yang ketiga hingga kedelapan berwarna biru dan yang kesembilan berwarna hitam:

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'

Ini hanya dimaksudkan sebagai contoh. Anda dapat menyesuaikan ini dengan isi hati Anda.

Bagi mereka yang lebih suka kode mereka tersebar di beberapa baris:

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'

Detail

tputadalah utilitas untuk menghasilkan berbagai kode kontrol untuk terminal Anda. Misalnya, tput setaf nsetel warna latar depan ke ntempat nberkisar dari 0 hingga 7

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

Anda dapat membaca lebih lanjut tentang tputdan kemampuan warnanya di sini .

Kode awk mendefinisikan variabel black ,, reddan blueyang berisi kode terminal masing-masing untuk hitam, merah, dan biru. Kode-kode ini ditempatkan di awal kolom apa pun yang ingin kita warnai.

Salah satu triknya adalah kode warna tidak mengatur ulang sendiri. Jadi, apa pun warna terakhir yang Anda tentukan pada satu baris akan, kecuali perintah warna lain ditentukan, menjadi warna default untuk baris berikutnya.

John1024
sumber
1
Huh, panggilan bagus untuk mendefinisikan variabel. Tidak tahu Anda bisa melakukannya dari dalam awk! Saya sarankan Anda menyertakan pola untuk mempertahankan penyelarasan kolom juga :)
Bob
@ Bob Dan, saya suka FPATtrik Anda untuk menjaga jarak yang benar.
John1024