2012-12-10 44 views
5

基本上我得到線從ls -la命令:如何獲得與正則表達式的分隔符n列

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

,並希望得到的文件(442)的大小。我試過cutsed命令,但沒有成功。只使用基本的UNIX工具(cut,sed,awk ...),我如何從stdin獲取特定列,其中分隔符是/ +/ regexp?

回答

12

如果您想要使用cut,您需要首先擠壓空間(tr -s ' '),因爲cut不支持+。這應該工作:

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

它與sed這樣做時(GNU SED)有點更多的工作:

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

略超過指衝,如果你使用grep替代(GNU的grep):

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

+1爲'sed |減少'流量。迄今爲止,用於柱式維修的最靈活,最強大,最簡潔的技術。 – gepoch

5

解析ls輸出比你想象的要困難。改用專用工具,如stat

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

一種方式ls -la some_file | awk '{print $5}'可以打破的,如果號碼使用空格作爲千​​位分隔符(這是常見於一些歐洲語言環境)。請參閱Why You Shouldn't Parse the Output of ls(1)

+1

謝謝,你的回答很好,但解析ls的輸出是比較實例的用法,然後是實際的用法。 – Ondra

2

管你的輸出和:

awk '{print $5}' 

甚至更​​好我們使用stat命令是這樣的(在Mac):

stat -f "%z" yourFile 

或(在Linux上)

stat -c "%s" yourFile 

那會以字節爲單位輸出文件的大小。