ls에서 awk 'print' 문으로 색상 파이프

ls에서 awk 'print' 문으로 색상 파이프

어제 제가 질문한 것에 대한 후속 답변입니다.디렉토리 목록에 파일 크기의 합을 표시합니다..

감사해요피레우스 제로그리고 올바른 방향의 점모리츠 한센, 나는 지금

function dir() {
        ls -FaGl "${@}" | awk '{print; total += $4}; END {print "\t\ttotal: ",total/1024,"KB"}'
}

내에서는 .bash_profile훌륭하게 작동합니다. 그러나 적어도 Linux에서는(아직 OSX에서는 시도해 볼 기회가 없었습니다) sshXP에서 PuTTY를 사용하면 이제 디렉토리 색상이 사라졌습니다. 색상 코드를 awk 문에 연결하는 방법이 있나요 print?

고쳐 쓰다

Suk Mingde에게 감사드립니다.답변, --color=always이전에 설정한 것처럼 추가하기만 하면 됩니다 auto. 그러나 이제 디렉토리 목록 끝과 전체 행 사이에 공백이 있습니다.

[19:30:58 mattdmo@server ~/webapps/django15 ] $ dir
drwxr-xr-x  7 mattdmo 4096 Mar 24 20:28 ./
drwxr-xr-x 17 root    4096 Mar 18 20:15 ../
drwxr-xr-x  7 mattdmo 4096 Mar 14 14:57 apache2/
drwxr-xr-x  3 mattdmo 4096 Mar 14 14:57 bin/
drwxr-xr-x  2 mattdmo 4096 Mar 24 20:10 lib/
drwxr-xr-x  3 mattdmo 4096 Mar 14 14:57 myproject/
drwxrwxr-x  3 mattdmo 4096 Mar 24 20:28 pigimal/

                total:  28 KB
[19:30:59 mattdmo@server ~/webapps/django15 ] $

이 문제 해결에 대한 제안 사항이 있습니까?

답변1

색상은 사용 시 유지되어야 합니다 ls --color=always. 그것이 gnu에 특정한 것인지는 확실하지 않습니다. [OP 편집: 그렇습니다.]

ls출력이 tty로 가는지 여부를 감지하는 경우입니다 .

그렇지 않은 경우 일반적으로 색상이 인쇄되지 않고 변환되지 않습니다. "인쇄할 수 없는 문자"물음표까지. 이 작업은 추가하여 수행할 수 있습니다.-q 옵션.

이 주제에 대한 추가 정보:ls가 출력하는 라인 수.


일부 색상 데이터에 대한 gnu coreutils source ls;ref:


편집하다:

gnu coreutils ls의 경우: --color=always
OS X의 ls: 환경 변수를 설정 CLICOLOR_FORCE하고 G색상을 나타냅니다. 핵심 규정 준수ls IEEE 표준 1003.1-2001. 다른 옵션은 구현 간 신중한 확장입니다.

좋아요 이에 대해 더 깊이 연구했습니다. 내가 읽은 바에 따르면 사람들은 OS X에 gnu coreutils도 설치하지만 다음을 사용할 수도 있을 것 같습니다.원래.

이것OS X ls 매뉴얼 페이지상태:

CLICOLOR_FORCE  
    Color sequences are normally disabled if the output isn't directed to a
    terminal.  This can be overridden by setting this flag.  The TERM 
    variable still needs to reference a color capable terminal however
    otherwise it is not possible to determine which color sequences to use.

출처에서:

Mac OS X 10.8.2 소스 코드->file_cmds-220.7->ㅋㅋㅋ/

또한 이 코드를 보면 다음과 같이 설정할 수 있다는 것이 금방 분명해집니다.

CLICOLOR_FORCE

강제 색상.

매개변수와 setenv색상을 먼저 구문 분석할 때 G:

    case 'G':
        setenv("CLICOLOR", "", 1);
        break;

구문 분석 후 argv:

/* CLICOLOR is set    AND    is a tty            OR */
if (getenv("CLICOLOR") && (isatty(STDOUT_FILENO) || 
etenv("CLICOLOR_FORCE")))
/*  force cli color is set */

다음 섹션에서는 TERM이 설정된 경우 색상이 사용됩니다.

if (tgetent(termcapbuf, getenv("TERM")) == 1) {

echo $TERM색상이 가능한 터미널을 생산해야 합니다. 하지만 정상적으로 색상이 나온다면 이런 현상이 나타날 것입니다.

---

마지막 업데이트로 편집:

확실하지 않습니다. 이상해요. 추가 줄이 있을 뿐만 아니라 total ...애초에 줄도 없습니다. 다음과 유사한 출력을 검토하여 시작할 수 있습니다.

function dir() {
/bin/ls -FaGl "${@}" | awk '
    function chr2hex(chr) {
        return sprintf("%02x", index(i2x, chr));
    }
    function str2hex(str) {
        r = ""
        for (i = 1; i <= length(str); ++i)
            r = r chr2hex(substr(str, i, 1));
        return r;
    }
    BEGIN {
        i2x = ""
        for (i = 0; i < 256; ++i)
            i2x = sprintf("%s%c", i2x, i);
        printf("FNR        : %d\n", FNR);
        printf("FIELDWIDTHS: \"%s\"\n", FIELDWIDTHS);
        printf("FS         : \"%s\"\n", str2hex(FS));
        printf("RS         : \"%s\"\n", str2hex(RS));
        printf("OFS        : \"%s\"\n", str2hex(OFS));
        printf("ORS        : \"%s\"\n", str2hex(OFS));
    }
    {
        printf("%2d:%2d:%2d \"%s\"\n", FNR, NR, NF, $0);
        total += $4;
    }
    END {
        printf("%21s: %d %s\n", "total", total / 1024, "KiB");
        printf("FNR        : %d\n", FNR);
        printf("From       : \"%s\"\n", FILENAME);
    }
'
}

당신에게 다음과 같은 것을 주어야합니다 -(~에서멍청 할 수도 있음 "-"):

$ ./dir testdir
FNR        : 0
FIELDWIDTHS: ""
FS         : "20"
RS         : "0a"
OFS        : "20"
ORS        : "20"
 1: 1: 2 "total 24"
 2: 2: 8 "drwxrwxr-x 6 mattdmo 4096 Apr 17 21:46 ./"
 3: 3: 8 "drwxrwxr-x 8 mattdmo 4096 Apr 18 10:47 ../"
 4: 4: 8 "drwxrwxr-x 2 mattdmo 4096 Apr 17 21:46 ab1/"
 5: 5: 8 "drwxrwxr-x 2 mattdmo 4096 Apr 17 21:46 ab2/"
 6: 6: 8 "drwxrwxr-x 2 mattdmo 4096 Apr 17 21:46 ab3/"
 7: 7: 8 "drwxrwxr-x 2 mattdmo 4096 Apr 17 21:46 ab4/"
                total: 24 KB
FNR        : 7
From       : ""

관련 정보