2012-12-10 9 views
5

Fondamentalmente ricevo linea dal ls -la di comando:Come ottenere colonna n con delimitatore regexp

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

e vuole ottenere la dimensione del file (442). Ho provato i comandi cut e sed, ma non ho avuto successo. Usando solo strumenti UNIX di base (taglia, sed, awk ...), come posso ottenere una colonna specifica da stdin, dove il delimitatore è / +/ regexp?

risposta

12

Se si desidera farlo con cut, è necessario innanzitutto premere lo spazio (tr -s ' ') perché cut non supporta +. Questo dovrebbe funzionare:

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

è un po 'più di lavoro quando si fa con sed (GNU sed):

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

Leggermente più dito punzonatura se si utilizza il grep alternativa (GNU grep):

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

+1 per "sed | tagliare 'flusso. Di gran lunga la tecnica più flessibile, potente e concisa per la colonna groking. – gepoch

5

L'analisi dell'uscita ls è più difficile di quanto si pensi. Utilizzare invece uno strumento dedicato come stat.

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

Un modo ls -la some_file | awk '{print $5}' potrebbe rompersi è che se i numeri utilizzano lo spazio come separatore delle migliaia (questo è comune in alcune versioni locali europee).

Vedere anche Why You Shouldn't Parse the Output of ls(1).

+1

Grazie, la tua risposta è buona, ma l'output di analisi è stato piuttosto un esempio di utilizzo, quindi l'utilizzo reale. – Ondra

2

tubo l'output con:

awk '{print $5}' 

O meglio ancora di usare il comando stat come questo (su Mac):

stat -f "%z" yourFile 

Or (su Linux)

stat -c "%s" yourFile 

questo produrrà la dimensione del file in byte.

Problemi correlati