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 .
sed
atau awk
dan memasukkan urutan escape ANSI .
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 .
sed
atau awk
dan memasukkan urutan escape ANSI .
Jawaban:
Ini bisa dilakukan dengan awk
. Sayangnya, karena format ls -l
tidak 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 FPAT
opsi, berkat jawaban SO ini :
ls -la | awk '
BEGIN {
FPAT = "([[:space:]]*[^[:space:]]+)";
OFS = "";
}
Dalam awk
, setiap paramisional posisional ( $1
,, $2
dll.) Mengacu pada satu bidang, yaitu satu kolom pada baris saat ini. Apa yang dilakukan FPAT
opsi di atas adalah mendefinisikan kembali setiap bidang untuk memasukkan semua ruang sebelumnya, jadi ketika Anda print
mundur 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 ( 0
antara [
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 bash
sesi 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:
--color=always
. Selama Anda tidak menerapkan warna berbeda ke kolom nama file ( $9
dalam contoh saya), awk
harus melewati mereka.
--color=always
adalah ekstensi GNU jadi jika Anda menggunakan sistem non-GNU (mis. MacOS, BSD lainnya) Anda harus menginstal versi GNU atau menggunakan alternatif .
Ini akan mencetak kolom kedua ls -alF
berwarna 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'
tput
adalah utilitas untuk menghasilkan berbagai kode kontrol untuk terminal Anda. Misalnya, tput setaf n
setel warna latar depan ke n
tempat n
berkisar 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 tput
dan kemampuan warnanya di sini .
Kode awk mendefinisikan variabel black
,, red
dan blue
yang 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.
awk
! Saya sarankan Anda menyertakan pola untuk mempertahankan penyelarasan kolom juga :)
FPAT
trik Anda untuk menjaga jarak yang benar.