2017-04-09 1 views
1

Ich habe einige Ausgabe wie folgt aus ls -alth:Wie Regex mit Schnitt in der Befehlszeile verwenden?

drwxr-xr-x 5 root admin 170B Aug 3 2016 .. 
drwxr-xr-x 5 root admin 70B Aug 3 2016 .. 
drwxr-xr-x 5 root admin  3B Aug 3 2016 .. 
drwxr-xr-x 5 root admin  9M Aug 3 2016 .. 

Nun, ich möchte den 170B Teil parsen, was natürlich die Größe in lesbarer Form ist. Ich wollte dies mit oder sed tun, weil ich keine komplizierteren/schwierigeren Werkzeuge als nötig verwenden möchte.

Im Idealfall möchte ich es robust genug sein, um die B, M oder K Suffix, das mit der Größe kommt zu handhaben, und vermehren sich entsprechend von 1, 1000000 und 1000 entsprechend. Ich habe jedoch keinen guten Weg gefunden, das zu tun.

Ich habe ein paar Dinge ausprobiert, ohne wirklich den besten Ansatz zu wissen:

ls -alth | cut -f 5 -d \s+ 

Ich hoffte, dass das funktionieren würde, weil ich in der Lage sein würde, um es nur auf einem zu begrenzen oder mehr Leerzeichen.

Aber das funktioniert nicht. Wie liefere ich mit einem Regex-Begrenzer? Oder gibt es eine einfachere Möglichkeit, nur die Größe der Datei aus ls -alth zu extrahieren?

Ich verwende CentOS6.4

+0

Warum nicht einfach 'ls -alth | cut -d“ "-f5' ..? –

+0

Ich habe eigentlich nie von dieser Option gehört. Das funktioniert nicht, weil es auf eine beliebige Anzahl von Leerzeichen aufgeteilt werden muss. Ihr Beispiel teilt sich nur auf ein Leerzeichen auf. Ich fügte der Frage einige weitere Beispielzeilen hinzu, um es ein wenig klarer zu machen. – guimption

+1

OK dann ... Was ist mit 'ls -alth | awk' {print $ 5} ''? Dies funktioniert standardmäßig mit jedem Leerzeichen. By the way, auch mit Cut funktioniert in meinem Debian. –

Antwort

2

Diese Antwort auf die Frage befasst als gefragt, aber George Vasiliou's helpful find solution als potenziell überlegene Alternative.

  • cut unterstützt nur ein einziges , literalen Zeichen als Trennzeichen (-d), so ist es nicht das richtige Werkzeug zu verwenden.

  • Für Tokens (Felder) Extrahieren, die pro Linie mit einer variablen Menge von Leerzeichen getrennt sind, awk ist das beste Werkzeug, so dass die Lösung von George Vasiliou ist die einfachste vorgeschlagen:
    ls -alth | awk '{print $5}'
    extrahiert den 5. whitespace- getrenntes Feld ($5), welches die Größe ist.

  • Anstatt -h zuerst zu verwenden und zurückzuverwandeln dann die Menschen lesbaren Suffixe (wie B, M und G) zurück auf die bloße Byte zählt (übrigens sind die Multiplikatoren ein Vielfaches von 1024, nicht 1000) einfach -h vom ls Befehl wegzulassen, die die rohen Byteanzahl von Standardausgänge:
    ls -alt | awk '{print $5}'

+1

@GeorgeVasiliou: Das ist eine gute Idee - Ich schlage vor, Sie Ihre eigene Antwort zu schaffen. – mklement0

+1

Das ist eigentlich eine große ida die '-h' Flagge von' ls -alth' wegzuzulassen. Daran hatte ich nicht gedacht. – guimption

2

Alternative zu der Lösung awk Tha t behandelt whitespace korrekt, man kann auch das find-Dienstprogramm verwenden, das ähnliche Ergebnisse wie ls liefert.

Tatsächlich können Sie find verwenden, um die Größe der Ergebnisse direkt anzuzeigen, ohne dass ein anderes Werkzeug/Rohr wie oder awk erforderlich ist.

also nur Bytes zur Liste können Sie:

$ find . -maxdepth 1 -printf %s\\n 
173 
3 
684 

Sie Dateiname + Bytes in find mit

$ find . -maxdepth 1 -printf %f-%s\\n 
bsd.txt-173 
file4-3 
shellcolors.sh-684 

Sie können man find konsultieren kombinieren können eine Menge von Optionen unter -printf sehen .

Darüber hinaus kann durch -maxdepth Option Entfernen können Sie auch eine Liste aller Dateien in den Unterverzeichnissen.

Eine weitere Alternative du Dienstprogramm zu verwenden ist, das fähig ist, Ergebnisse in für Menschen lesbaren Format zur Verfügung zu stellen:

$ du -a -b -h -d1 
1.9M ./appsfiles 
173 ./bsd.txt 
3 ./file4 
684 ./shellcolors.sh 

-a: alle Dateien und Verzeichnisse. Entfernen Sie diese Option, um nur Verzeichnisse Größe
-b zu erhalten: Berichte die reale Größe der Datei - diese Option entfernen, wird die Festplattengröße durch diese Datei belegt berichten (dh eine Datei von 3 kB belegt 4K in Wirklichkeit)
-h: Menschen lesbaren Größe
-d1: Tiefe1

Sie können ferner die Ergebnisse der du mit |cut -d" " -f1 analysieren oder mit |awk '{print $1}'