Bash

通過管道將顏色從 ls 傳遞到 awk ‘print’ 語句

  • November 12, 2015

這是我昨天提出的問題Show sum of file sizes in directory Listing的後續問題。

感謝Zero Piraeus和Mauritz Hansen指出的正確方向,我現在有了

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

在我的.bash_profile,它工作得很好。但是,至少在 Linux 上(我還沒有機會在 OSX 上嘗試過),我正在sshXP 上使用 PuTTY,我的目錄顏色現在已經消失了。有沒有辦法通過管道將顏色程式碼傳遞給 awkprint語句?

更新

感謝 Sukminder 的回答,添加--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 ] $

有關解決此問題的任何建議嗎?

通過使用ls --color=always顏色應該被保留。我不確定它是否是特定於 gnu 的。[從OP編輯:是的,是的。]

情況是ls檢測輸出是否到 tty。

如果不是,它通常不會列印顏色,也不會將 *“不可列印的字元”*翻譯成問號。這可以通過-q 選項添加。

有關該主題的更多資訊:ls 輸出的行數


gnu coreutils 源 ls; 參考。在一些顏色數據上:


編輯:

對於 gnu coreutils ls:--color=always

對於 OS X 的 ls:設置環境變數CLICOLOR_FORCEG表示顏色。核心符合ls IEEE Std 1003.1-2001 標準。其他選項是在實現之間謹慎的擴展。

好的。對此進行了更深入的了解。雖然從我讀到的人們也在 OS X 上安裝 gnu coreutils,我猜你可能使用原始的.

ls狀態的OS X 手冊頁:

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 -> ls/

從該程式碼中也可以很快清楚地知道可以設置

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

應該給你類似的東西 - (來自可能是"-"例如 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       : ""

引用自:https://unix.stackexchange.com/questions/72799