2012-12-10 6 views
5

Grundsätzlich bekommen ich Linie von ls -la Befehl erhalten:Wie n-ten Spalte mit regexp Begrenzer

-rw-r--r-- 13 ondrejodchazel staff 442 Dec 10 16:23 some_file 

und wollen Größe der Datei erhalten (442). Ich habe versucht und sed Befehle, aber war nicht erfolgreich. Verwenden Sie nur einfache UNIX-Tools (cut, sed, awk ...). Wie kann ich eine bestimmte Spalte von stdin erhalten, wobei delimiter / +/ regexp ist?

Antwort

12

Wenn Sie es mit cut tun möchten, müssen Sie den Speicherplatz zuerst quetschen (tr -s ' '), weil + nicht unterstützt. Dies sollte funktionieren:

ls -la | tr -s ' ' | cut -d' ' -f 5 

Es ist ein bisschen mehr Arbeit, wenn es mit sed (GNU sed) tun:

ls -la | sed -r 's/([^ ]+ +){4}([^ ]+).*/\2/' 

Etwas mehr Finger Stanzen wenn Sie die grep Alternative (GNU grep):

ls -la | grep -Eo '[^ ]+(+[^ ]+){4}' | grep -Eo '[^ ]+$' 
+0

+1 für 'sed | Schnitt 'Flow. Mit Abstand die flexibelste, kraftvollste und prägnanteste Technik für das Spalten-Grokking. – gepoch

5

Parsing ls Ausgabe ist härter als Sie denken. Verwenden Sie stattdessen ein spezielles Tool wie stat.

size=$(stat -c '%s' some_file) 

Ein Weg ls -la some_file | awk '{print $5}' brechen könnte, ist, wenn Zahlen Raum als Tausendertrenn verwenden (dies ist in einigen europäischen Gegenden üblich).

Siehe auch Why You Shouldn't Parse the Output of ls(1).

+1

Danke, Ihre Antwort ist gut, aber Parsing ls-Ausgabe war eher Beispiel für die Verwendung, dann die tatsächliche Verwendung. – Ondra

2

Rohr Ihrer Ausgabe mit:

awk '{print $5}' 

Oder noch besser wir stat Befehl wie folgt zu verwenden (auf dem Mac):

stat -f "%z" yourFile 

Or (unter Linux)

stat -c "%s" yourFile 

Das wird die Größe der Datei in Bytes ausgeben.