Übergeben Sie die Farben von ls durch die Pipe an die awk-Anweisung 'print'

8

Dies ist eine Fortsetzung meiner gestrigen Frage: Summe der Dateigrößen in der Verzeichnisliste anzeigen .

Dank Zero Piraeus und einem Punkt in die richtige Richtung von Mauritz Hansen habe ich jetzt

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

in meinem .bash_profile, und es funktioniert großartig. Zumindest unter Linux (ich hatte noch keine Gelegenheit, es unter OSX auszuprobieren), wo ich sshPuTTY unter XP verwende, sind meine Verzeichnisfarben jetzt weg. Gibt es eine Möglichkeit, die Farbcodes durch die Pipe an die awk- printAnweisung weiterzuleiten ?

Aktualisieren

Dank Sukminders Antwort--color=always macht das Hinzufügen den Trick, wie er zuvor eingestellt autoworden war. Jetzt wird jedoch zwischen dem Ende der Verzeichnisliste und der Gesamtzeile ein Leerzeichen angezeigt:

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

Irgendwelche Vorschläge zur Behebung dieses Problems?

MattDMo
quelle
Erhalten Sie diese zusätzliche Zeile hier nicht. Was benutzt lsdu? ls --versionoder so ähnlich. Warum hast du zB nicht total ...in der ersten Zeile? Sicher, das ist das ganze Drehbuch?
Runium
@Sukminder Ich verwende ls (GNU coreutils) 8.4 unter Linux 2.6.32-358.2.1.el6.x86_64 (mein Webhosting-Anbieter). Wie ich unten sagte, habe ich dies zu Hause noch nicht auf meiner OSX-Box getestet - das läuft mit 10.8.3, und ich bin ziemlich sicher, dass ich die GNU-Coreutils installiert habe, aber ich bin nicht in der Stadt und werde es nicht wissen bis morgen abend. Und ja, der volle Funktionskörper istls -FaGl "${@}" --color=always | awk '{print; total += $4}; END {print "\t\ttotal: ",total/1024,"KB"}'
MattDMo

Antworten:

10

Durch die Verwendung sollten ls --color=alwaysdie Farben erhalten bleiben. Ich bin mir nicht sicher, ob es gnu-spezifisch ist. [ Bearbeiten von OP: Ja, das ist es. ]]

Der Fall ist, dass lsfestgestellt wird, ob die Ausgabe zu tty ist oder nicht.

Wenn dies nicht der Fall ist, werden normalerweise keine Farben gedruckt und "nicht druckbare Zeichen" nicht in Fragezeichen übersetzt. Dies kann durch die -q Option hinzugefügt werden .

Mehr zum Thema: Anzahl der von ls ausgegebenen Zeilen .


gnu coreutils source ls; ref. zu einigen Farbdaten:


Bearbeiten:

Für gnu coreutils ls: --color=always
Für OS X ls: Umgebungsvariable festlegen CLICOLOR_FORCEund GFarbe bedeuten. Der Kern entspricht dem IEEE Std 1003.1-2001 . Andere Optionen sind Erweiterungen, die zwischen den Implementierungen vorsichtig sind.

OK. Ich habe mir das genauer angesehen. Nach dem, was ich gelesen habe, installieren die Leute auch Gnu Coreutils unter OS X, aber Sie verwenden wahrscheinlich das Original .

Die OS X-Manpages für ls geben Folgendes an :

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.

Aus der Quelle:

Mac OS X 10.8.2 Quelle -> file_cmds-220.7 -> ls /

Aus diesem Code wird auch schnell klar, dass man einstellen kann

CLICOLOR_FORCE

Farbe erzwingen.

Beim ersten Analysieren von Argumenten und setenvFarben auf G:

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

Und nach dem argvParsen:

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

Wenn im nächsten Abschnitt TERM eingestellt ist, wird die Farbe verwendet:

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

echo $TERMsollte ein farbfähiges Terminal ergeben. Wenn Sie jedoch normale Farben erhalten, sollte dies der Fall sein.

--- ---.

Bis zum letzten Update bearbeiten:

Ich bin mir dann nicht sicher. Es ist seltsam. Nicht nur die zusätzliche Zeile, sondern auch, dass Sie total ...am Anfang keine haben . Sie könnten damit beginnen, die Ausgabe von so etwas zu überprüfen:

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

Sollte dir so etwas geben wie - ( Von könnte "-"zB gawk sein):

$ ./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       : ""
Runium
quelle
Danke, das funktioniert! Bitte beachten Sie jedoch mein Update oben - es gibt jetzt eine leere Zeile nach der Verzeichnisliste. Irgendwelche Ideen?
MattDMo
Getestet und bekomme diese nachgestellte Leerzeile nicht. Gibt ls -FaGlqes irgendwelche Fragezeichen? Ebenfalls; Beachten Sie, dass gemäß den Manpages lsin OS X nur Optionen für einen Buchstaben verwendet werden. G bedeutet Farbe und man muss die CLICOLOR_FORCEUmgebungsvariable verwenden, um die Farbe durch das Rohr zu erhalten. - wie in no --color = immer und Gbedeutet nicht --no-group. Die Version entspricht ls IEEE Std 1003.1-2001 . Und Getc. ist Erweiterungen.
Runium
Entschuldigung, ich war nicht klar - ich habe es unter Linux getestet. Ich hatte noch keine Gelegenheit, OSX zu Hause zu testen, aber ich bin froh zu hören, dass es wie erwartet funktioniert.
MattDMo
Mein Test war auf Debian mit ls (GNU coreutils) 8.13.
Runium