Tytuł niby mówi wszystko: Chciałbym, aby te schludne kolorowe kolumny wyjściu coś takiego ls -al
, powiedzmy, jak w odpowiedzi 10basetom jest na to pytanie .
Tytuł niby mówi wszystko: Chciałbym, aby te schludne kolorowe kolumny wyjściu coś takiego ls -al
, powiedzmy, jak w odpowiedzi 10basetom jest na to pytanie .
Odpowiedzi:
Można to zrobić za pomocą awk
. Niestety, ponieważ format ls -l
jest nieokreślony, nie jest możliwe wymyślenie rozwiązania, które będzie działać na każdym systemie, więc pewna korekta koloru, którego użyć, dla której kolumny będzie konieczna w niektórych systemach.
Po pierwsze, chcemy zachować oryginalne przestrzenie używane przez ls -l
. W przeciwnym razie wyrównanie kolumny będzie nieprawidłowe. Możemy to zrobić z FPAT
opcją, dzięki tej odpowiedzi SO :
ls -la | awk '
BEGIN {
FPAT = "([[:space:]]*[^[:space:]]+)";
OFS = "";
}
W awk
, każdy parametr pozycyjny ( $1
, $2
itp.) Odnosi się do jednego pola, tj. Jednej kolumny w bieżącym wierszu. Co FPAT
powyższa opcja nie jest przedefiniowanie każde pole, aby uwzględnić wszystkie poprzedzające przestrzenie, więc kiedy print
to z powrotem utrzymuje przestrzenie więc kolumny pozostać w tym samym miejscu.
Teraz możemy po prostu edytować każde pole, aby wstawić kod koloru , a następnie wydrukować edytowane dane wyjściowe:
{
$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
}
'
Zauważ, że później każda kolumna jest przywracana do wartości domyślnych ( 0
między [
a m
). Jeśli chcesz, aby kolor był wyświetlany w wielu kolumnach, możesz pominąć ten kod. Osobiście wolę określać każdą kolumnę niezależnie.
Możesz zdefiniować polecenie wielokrotnego użytku w swoim .bashrc
. Na przykład:
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
}
'
}
Może być konieczne zrestartowanie bash
sesji (lub uruchomienie source ~/.bashrc
), aby ta definicja funkcji mogła zostać uruchomiona.
Stąd możesz po prostu zadzwonić lsc
, co powinno dać ci pożądany efekt:
--color=always
. Dopóki nie zastosujesz różnych kolorów w kolumnie z nazwą pliku ( $9
w moim przykładzie), awk
powinieneś je przepuścić.
--color=always
jest rozszerzeniem GNU, więc jeśli korzystasz z systemu innego niż GNU (np. MacOS, inne BSD), musisz zainstalować wersję GNU lub użyć alternatywy .
Spowoduje to wydrukowanie drugiej kolumny ls -alF
w kolorze czerwonym, od trzeciej do ósmej w kolorze niebieskim i dziewiątej w kolorze czarnym:
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'
Jest to tylko przykład. Możesz dostosować to do treści swojego serca.
Dla tych, którzy wolą kod rozłożony na wiele wierszy:
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
to narzędzie do generowania szerokiej gamy kodów kontrolnych dla twojego terminala. Na przykład tput setaf n
wybór koloru planu pierwszego n
w którym n
może mieścić się w zakresie od 0 do 7
0 – Black
1 – Red
2 – Green
3 – Yellow
4 – Blue
5 – Magenta
6 – Cyan
7 – White
Więcej informacji na temat tput
możliwości kolorów można znaleźć tutaj .
Definiuje się kod awk zmienne black
, red
i blue
które zawierają kody zaciskowe dla czarnego, czerwony i niebieski, odpowiednio. Kody te są umieszczane na początku dowolnej kolumny, którą chcemy pokolorować.
Jedna sztuczka polega na tym, że kody kolorów nie resetują się same. Tak więc, bez względu na ostatni kolor określony w jednej linii, o ile nie zostanie określone inne polecenie koloru, będzie domyślnym kolorem dla następnej linii.
awk
! Sugeruję także dodanie wzoru, aby zachować wyrównanie kolumn :)
FPAT
sztuczka polegająca na utrzymywaniu prawidłowych odstępów.