2017-04-09 49 views
1

我有一些像這樣的輸出ls -alth如何在命令行中使用正則表達式切割?

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 .. 

現在,我想解析出170B部分,這顯然是在人類可讀的格式大小。我想用cutsed這樣做,因爲我不想使用比所需更復雜/難以使用的工具。

理想我希望它有足夠能力去處理伴隨大小BMK後綴,並通過110000001000據此相應地成倍增加。不過,我還沒有找到一個好的方法來做到這一點。

我已經嘗試了一些事情沒有真正瞭解的最佳途徑:

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

我希望將工作,因爲我可以只限定它一個或多個空格

但這並不奏效。我如何提供一個正則表達式分隔符cut?還是有更簡單的方法來從ls -alth只提取文件的大小?

我使用的是CentOS6.4

+0

爲什麼不'LS -alth結果|切-d」「-f5' ..? –

+0

我其實從來沒有聽說過這個選擇。這是行不通的,因爲它需要分割任意數量的空間。你的例子只在一個空間分裂。我在問題中增加了幾條示例行,以使其更加清晰。 – guimption

+1

好吧...那麼'ls -alth | awk'{print $ 5}''?這在缺省情況下適用於任何空白區域。順便說一下,即使在我的Debian中進行了剪切工作。 –

回答

2

這個答案剷球如問這個問題,但考慮George Vasiliou's helpful find solution作爲一個潛在的優良替代品。

  • cut只支持一個單一,文字字符作爲分隔符(-d),所以它是不使用合適的工具。

  • 用於提取與每行的空白可變量的分隔的標記(字段),awk是最好的工具,所以通過George Vasiliou提出的解決方案是最簡單的一種:
    ls -alth | awk '{print $5}'
    提取第五whitespace-分隔的字段($5),這是大小。

  • 除了使用-h第一和然後重新轉換人類可讀後綴(如BM,並G)回僅僅字節計數(另外,乘法器必須是1024倍數,不1000) ,只需從ls命令,默認情況下輸出的原始字節計數省略-h
    ls -alt | awk '{print $5}'

+1

@GeorgeVasiliou:這是一個好主意 - 我建議創建自己的答案。 – mklement0

+1

這實際上是從'ls -alth'中省略'-h'標誌的好方法。我沒有想到這一點。 – guimption

2

替代AWK溶液THA t會正確處理空白,也可以使用find實用程序,它可以提供類似於ls的結果。

實際上,您可以使用find直接顯示結果的大小,而無需使用任何其他工具/管道,如cutawk

所以,要列出只是個字節你可以使用:

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

您可以找到

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

組合文件名+字節你可以諮詢man find看到很多可供選擇的-printf下。

此外,通過刪除-maxdepth選項,您還可以列出子目錄中的所有文件。

還有一個替代方案是使用du效用,其能夠提供在人類可讀的格式的結果:

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

-a:所有文件和目錄。刪除此選項以獲取僅目錄大小
-b報告文件的實際大小 - 刪除此選項將報告此文件佔用的磁盤大小(即3 kB的文件實際佔用4K)
-h:人類可讀大小
-d1:depth1

您可以進一步解析的杜與|cut -d" " -f1|awk '{print $1}'