ls의 출력 열을 색칠하는 방법은 무엇입니까?


8

제목 종류는 모든 것을 말한다 : 나는 같은 출력의 그 깔끔한 색상의 열을 좀하고 싶습니다 ls -al같이 말을 10basetom의 대답이 질문에 .

링크 된 답변의 구문 강조 코드 스 니펫 스크린 샷


글쎄, 이것은 깔끔한 아이디어입니다! 그러나 어떤 OS를 사용하고 있습니까?
JakeGould

2
SE 소프트웨어가 Bash 구문을 강조한 것 같습니다. 열별로 색상이 표시되지 않지만 숫자 (숫자)는 하나의 색상을 얻고 대문자로 시작하는 것은 다른 색상을 얻는 것처럼 보입니다. 열당 채색은 가능하지만 다소 다릅니다.
Bob

3
일반적인 의미에서, 당신은 함께 열 구분에 출력을 분할 할 수 있습니다 sed또는 awk및 삽입 ANSI 이스케이프 시퀀스 .
Bob


저는 Windows 10 Ubuntu 하위 시스템을 사용하고 있지만 macOS로 전환 중입니다 (WinX로 판명 된 전체 재해로 인해 ...)
Pirx

답변:


8

이것은로 할 수 있습니다 awk. 불행히도의 형식 ls -l이 지정되어 있지 않기 때문에 모든 시스템에서 작동하는 솔루션을 만들 수 없으므로 일부 시스템에서 어떤 열에 어떤 색상을 사용해야 할지를 조정할 수 있습니다.


먼저에 사용 된 원래 공간을 유지하려고합니다 ls -l. 그렇지 않으면 열 정렬이 올바르지 않습니다. 이 SO 답변FPAT 덕분에 옵션 으로이 작업을 수행 할 수 있습니다 .

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

에서는 awk, 각각의 위치는 PARAM ( $1, $2등)을 하나 개의 필드, 즉 현재 행에 하나의 컬럼을 의미한다. FPAT위 의 옵션은 이전의 모든 공백을 포함하도록 각 필드를 재정의하므로 공백 print을 유지하면 열이 동일한 위치를 유지하도록 공백을 유지합니다.

이제 각 필드를 편집하여 색상 코드 를 삽입 한 다음 편집 된 출력을 인쇄 할 수 있습니다.

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

공지 사항 각 열은 기본적으로 다시 돌아합니다 (이다 0사이 [m그 이후가). 여러 열에서 색상을 실행하려는 경우 해당 코드를 생략 할 수 있습니다. 개인적으로 각 열을 독립적으로 지정하는 것을 선호합니다.


에서 재사용 가능한 명령을 정의 할 수 있습니다 .bashrc. 예를 들면 다음과 같습니다.

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

이 함수 정의를 실행 bash하려면 세션 을 다시 시작 하거나 실행 해야 할 수도 source ~/.bashrc있습니다.

여기에서을 호출 lsc하면 원하는 결과를 얻을 수 있습니다.

컬러 출력 스크린 샷


멋진 사람들, 이것은 거의 내가 원하는 것입니다 ;-) 진지하게, 나는 하나 더 비틀기를 추가하고 파일 이름을 채색하고 싶습니다. ls -al --color = auto가 그렇게하지만 위의 솔루션에 --color 옵션을 추가하면 색상 코드가 제거 된 것처럼 보입니다. 우리는 그것들을 유지하기 위해 awk를 얻을 수 있습니까?
Pirx

두 번째 의견, 이것은 호기심에서 벗어났습니다. 원래 질문에서 언급 한 답변에서 10basetom이 위의 것을 사용하지 않았으며 여전히 색상이있는 열이있는 것처럼 보입니다. 그가 다른 버전의 ls 또는 멋진 스마트 터미널을 사용했기 때문인지 궁금합니다.
Pirx

@Pirx 답변의 색칠은 Stack Exchange 소프트웨어에 의해 적용됩니다. 터미널에서 나오지 않습니다. 출력이 코드 블록에 붙여졌고 질문에 bash 태그 가 있었기 때문에 질문과 답변의 코드 태그에 Bash 구문 강조 표시를 자동으로 적용하려고합니다 ...이 경우 실제로 잘못되었습니다. 의도적으로 채색하지 않았지만 코드의 문자열이 대답에서 빨간색 인 것과 같은 이유입니다.

1
@Pirx 사용 --color=always. 파일 이름 열에 다른 색상을 적용하지 않는 한 ( $9내 예에서는) awk통과시켜야합니다.

@Pirx Side note --color=always는 GNU 확장이므로 GNU 이외의 시스템 (예 : macOS, 기타 BSD)을 사용 하는 경우 GNU 버전을 설치하거나 대안을 사용해야 합니다 .

6

그러면 두 번째 열은 ls -alF빨간색으로, 세 번째에서 여덟 번째는 파란색으로, 아홉 번째는 검은 색으로 인쇄됩니다.

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'

이것은 단지 예를위한 것입니다. 당신은 당신의 마음의 내용에 맞게 사용자 정의 할 수 있습니다.

코드를 선호하는 사람들은 여러 줄로 퍼져 있습니다.

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터미널에 대한 다양한 제어 코드를 생성하는 유틸리티입니다. 예를 들어, tput setaf n전경색 을 0에서 7까지의 범위 nn설정할 수 있습니다.

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

자세한 내용 tput과 색상 기능은 여기를 참조하십시오 .

AWK 코드를 정의하는 변수 black, redblue그 블랙, 적색, 청색 각각에 대한 단말기 번호를 포함한다. 이 코드는 채색하려는 열의 시작 부분에 배치됩니다.

한 가지 트릭은 색상 코드가 자체적으로 재설정되지 않는다는 것입니다. 따라서 다른 색상 명령을 지정하지 않으면 한 줄에 마지막으로 지정한 색상이 다음 줄의 기본 색상이됩니다.


1
응, 변수 정의에 대한 좋은 요구. 당신이 그 안에서 그것을 할 수 있다는 것을 몰랐습니다 awk! 열 정렬을 유지하기 위해 패턴을 포함하는 것이 좋습니다. :)
Bob

@ 밥 그리고 나는 FPAT간격을 올바르게 유지하는 트릭을 좋아한다 .
John1024
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.