Jak pokolorować kolumny wyjściowe z ls?

8

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 .

Zrzut ekranu fragmentu kodu wyróżnionego składnią z połączonej odpowiedzi

Pirx
źródło
Cóż, to fajny pomysł! Ale na jakim systemie operacyjnym jesteś?
JakeGould
2
Wygląda na (niepoprawnie) podświetloną składnię Bash przez oprogramowanie SE. Wygląda na to, że nie jest pokolorowany według kolumny, ale raczej cyfry (liczby) mają jeden kolor, a wszystko, co zaczyna się na wielkie litery, ma inny. Kolorowanie na kolumnę jest wykonalne, ale raczej inne.
Bob
3
W ogólnym sensie można podzielić dane wyjściowe na separatorach kolumn za pomocą sedlub awki wstawić sekwencję specjalną ANSI .
Bob
Powiązane: superuser.com/q/665274
Tyson
Jestem na podsystemie Ubuntu Windows 10, ale przechodzę na macOS (biorąc pod uwagę całkowitą katastrofę, jaką okazał się WinX ...)
Pirx

Odpowiedzi:

8

Można to zrobić za pomocą awk. Niestety, ponieważ format ls -ljest 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 FPATopcją, dzięki tej odpowiedzi SO :

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

W awk, każdy parametr pozycyjny ( $1, $2itp.) Odnosi się do jednego pola, tj. Jednej kolumny w bieżącym wierszu. Co FPATpowyższa opcja nie jest przedefiniowanie każde pole, aby uwzględnić wszystkie poprzedzające przestrzenie, więc kiedy printto 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 ( 0mię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 bashsesji (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:

Zrzut ekranu z kolorowym wyjściem

Kok
źródło
Wspaniali faceci, to jest prawie to, czego chcę ;-) Poważnie, chciałbym jednak dodać jeszcze jeden zwrot i nadać kolor nazwom plików. ls -al --color = auto zrobiłby to, ale jeśli po prostu dodam opcję --color do powyższych rozwiązań, kody kolorów wydają się być usuwane. Czy możemy dostać awk, aby je zatrzymać?
Pirx
Drugi komentarz, to bardziej z ciekawości: w odpowiedzi, do której odniosłem się w moim pierwotnym pytaniu, wygląda na to, że 10basetom nie użył żadnego z powyższych, i nadal miał kolorowe kolumny. Zastanawiam się, czy to dlatego, że użył innej wersji ls, czy jakiegoś fantazyjnego inteligentnego terminalu?
Pirx
@Pirx Kolorystyka w odpowiedzi jest stosowana przez oprogramowanie Stack Exchange. To nie pochodzi z ich terminala. Tylko dlatego, że wynik został wklejony w bloku kodu, a pytanie miało znacznik bash , który automatycznie próbuje zastosować wyróżnianie składni Bash do wszystkich znaczników kodu w pytaniu i odpowiedziach ... co w tym przypadku jest nieprawidłowe. Z tego samego powodu ciągi w kodzie są czerwone w mojej odpowiedzi, mimo że celowo ich nie pokolorowałem.
Bob
1
@Pirx Use --color=always. Dopóki nie zastosujesz różnych kolorów w kolumnie z nazwą pliku ( $9w moim przykładzie), awkpowinieneś je przepuścić.
Bob
@Pirx Uwaga dodatkowa, --color=alwaysjest rozszerzeniem GNU, więc jeśli korzystasz z systemu innego niż GNU (np. MacOS, inne BSD), musisz zainstalować wersję GNU lub użyć alternatywy .
Bob
6

Spowoduje to wydrukowanie drugiej kolumny ls -alFw 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'

Detale

tputto narzędzie do generowania szerokiej gamy kodów kontrolnych dla twojego terminala. Na przykład tput setaf nwybór koloru planu pierwszego nw którym nmoż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 tputmożliwości kolorów można znaleźć tutaj .

Definiuje się kod awk zmienne black, redi bluektó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.

John1024
źródło
1
Huh, dobre wezwanie do definiowania zmiennych. Nie wiedziałem, że możesz to zrobić od wewnątrz awk! Sugeruję także dodanie wzoru, aby zachować wyrównanie kolumn :)
Bob
@ Bob I podoba mi się twoja FPATsztuczka polegająca na utrzymywaniu prawidłowych odstępów.
John1024