Truyền màu từ ls qua đường ống đến câu lệnh 'in' awk


8

Đây là phần tiếp theo cho câu hỏi của tôi từ hôm qua, Hiển thị tổng kích thước tệp trong danh sách thư mục .

Nhờ Zero Piraeus và một điểm đi đúng hướng của Mauritz Hansen , giờ tôi đã có

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

trong tôi .bash_profile, và nó hoạt động rất tốt. Tuy nhiên, ít nhất là trên Linux (tôi chưa có cơ hội dùng thử trên OSX), khi tôi đang sshsử dụng PuTTY trên XP, màu dir của tôi đã biến mất. Có cách nào để chuyển mã màu qua đường ống đến printcâu lệnh awk không?

Cập nhật

Nhờ câu trả lời của Sukminder , thêm vào --color=alwaysđó là mẹo, như đã được đặt ra autotrước đó. Tuy nhiên, bây giờ tôi nhận được một khoảng trống giữa cuối danh sách thư mục và dòng tổng:

[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 ] $

Bất kỳ đề nghị về sửa lỗi này?


Không có thêm dòng ở đây. Bạn lsđang sử dụng cái gì ls --versionhoặc tương tự. Tại sao bạn không có ví dụ total ...ở dòng đầu tiên? Chắc chắn đó là toàn bộ kịch bản?
Runium

@Sukminder Tôi đang sử dụng ls (GNU coreutils) 8.4 trên linux 2.6.32-358.2.1.el6.x86_64 (nhà cung cấp dịch vụ lưu trữ web của tôi). Như tôi đã nói bên dưới, tôi chưa thử nghiệm cái này trên hộp OSX của mình ở nhà - nó đang chạy 10.8.3 và tôi khá chắc chắn rằng tôi đã cài đặt lõi GNU, nhưng tôi không ở trong thị trấn và không biết Cho đến tối mai. Và vâng, cơ thể đầy đủ chức năng làls -FaGl "${@}" --color=always | awk '{print; total += $4}; END {print "\t\ttotal: ",total/1024,"KB"}'
MattDMo

Câu trả lời:


10

Bằng cách sử dụng ls --color=alwaysmàu sắc nên được bảo tồn. Tôi không chắc chắn nếu nó là cụ thể gnu mặc dù. [ Chỉnh sửa từ OP: đúng vậy. ]

Trường hợp là lsphát hiện xem đầu ra là tty hay không.

Nếu không, nó thường không in màu và không dịch "ký tự không thể in" thành dấu hỏi. Điều này có thể được thêm vào bởi các -q tùy chọn .

Thêm về chủ đề: Số dòng được xuất ra bởi ls .


gut coreutils nguồn ls; tham chiếu trên một số dữ liệu màu:


Biên tập:

Đối với gnu coreutils ls: --color=always
Đối với ls của OS X: đặt biến môi trường CLICOLOR_FORCEGcó nghĩa là màu. Lõi phù hợp với ls IEEE Std 1003.1-2001 . Các tùy chọn khác là các phần mở rộng cảnh giác giữa các triển khai.

ĐỒNG Ý. Có một cái nhìn sâu hơn về điều này. Mặc dù từ những gì tôi đọc xung quanh mọi người cũng cài đặt gnu coreutils trên OS X, tôi đoán có lẽ bạn sử dụng bản gốc .

Các trang man OS X cho trạng thái 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.

Từ nguồn:

Nguồn Mac OS X 10.8.2 -> file_cmds-220.7 -> ls /

Từ mã đó cũng nhanh chóng rõ ràng rằng người ta có thể thiết lập

CLICOLOR_FORCE

để buộc màu.

Vì nó lần đầu tiên phân tích các đối số và setenvmàu sắc trên G:

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

Và sau khi argvphân tích cú pháp:

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

Theo phần tiếp theo nếu TATE được đặt, màu được sử dụng:

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

echo $TERMnên mang lại một thiết bị đầu cuối màu có khả năng. Nhưng nếu bạn có được màu sắc bình thường thì đây là trường hợp.

---

Chỉnh sửa để cập nhật lần cuối:

Không chắc rồi. Nó lạ. Không chỉ có thêm dòng mà bạn không có bất kỳ dòng nào total ...khi bắt đầu. Bạn có thể bắt đầu bằng cách kiểm tra đầu ra của một cái gì đó như thế này:

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

Sẽ cung cấp cho bạn một cái gì đó như - ( Từ có thể "-"bằng ví dụ như gawk):

$ ./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       : ""

cảm ơn, công việc này Tuy nhiên, vui lòng xem cập nhật của tôi ở trên - hiện có một dòng trống sau danh sách thư mục. Có ý kiến ​​gì không?
MattDMo

Đã kiểm tra nó và không nhận được dòng trống đó. Có ls -FaGlqcung cấp cho bạn bất kỳ dấu hỏi? Cũng thế; lưu ý theo các trang man cho lsOS X, chúng chỉ sử dụng một tùy chọn chữ cái. G có nghĩa là màu sắc và người ta phải sử dụng CLICOLOR_FORCEbiến môi trường để có được ống máng màu. - như trong không --color = luôn, và Gkhông có nghĩa --no-group. Phiên bản phù hợp với ls IEEE Std 1003.1-2001 . Và Gvv là phần mở rộng.
Runium

xin lỗi, tôi không rõ ràng - tôi đã thử nghiệm nó trên Linux. Tôi chưa có cơ hội thử nghiệm OSX tại nhà, nhưng tôi rất vui khi biết nó hoạt động như mong đợi.
MattDMo

Thử nghiệm của tôi là về debian bằng ls (GNU coreutils) 8.13.
Runium
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.