通過管道將顏色從 ls 傳遞到 awk ‘print’ 語句
這是我昨天提出的問題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 上嘗試過),我正在ssh
XP 上使用 PuTTY,我的目錄顏色現在已經消失了。有沒有辦法通過管道將顏色程式碼傳遞給 awk更新
感謝 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_FORCE
並G
表示顏色。核心符合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 : ""