2015-11-06 72 views
3

更新:這個回答更加簡單,結果並不需要grep。哇,我的臉紅了!從bash輸出中獲取值

我對bash編程相當陌生,所以這可能是一個簡單的答案,但是當我的谷歌搜索出現了很多bash grep示例和很多bash數組示例時,它並沒有顯示任何內容可以弄清楚如何適應我想要做的事情。

其基本思想是我想從另一個程序的輸出的每一行中拉出一位,並將它們放入一個數組中。假設這是輸出:

_ filename1 2015-11-06 
. filename2 2015-11-04 
X filename3 2015-11-01 
_ filename4 2015-10-22 

所有內容都以空格分隔,而不是製表符分隔。

我想要做的是在bash中獲得一個數組,其中包含只是的文件名,沒有別的。所以對照這個例子運行它的結果是四項數組。我已經創建了數組,其中包含所有按空格分隔的片斷(因此包含12個項目)以及大量空陣列,但無法弄清楚如何獲取文件名。

我在不是我的升級(3.2.53(1) - 釋放)的bash的舊版本,所以readarray不可用。

感謝您的幫助!

回答

1

這個版本使用正則表達式和涉及空間中的文件名:

arr = (command | $(sed -s "s/^.\s\(.\+\)\s[0-9\-]\+\$/\1/")) 

例子:

a="_ filename1 2015-11-06         
. filename2 2015-11-04 
X filename3 2015-11-01 
_ filen a m e4 2015-10-22" 

echo "$(echo $a | sed -s "s/^.\s\(.\+\)\s[0-9\-]\+\$/\1/")" 

輸出:

filename1 
filename2 
filename3 
filen a m e4 
3

您可以使用cut搶第二場,並把它變成一個數組:

arr=($(command | cut -d ' ' -f 2)) 

另一個純BASH選擇是使用process substitution

arr=() 
while read -r _ fn _; do 
    arr+=("$fn") 
done < <(command) 

編輯:用空格處理文件名使用:

arr=() 
while read -r fn ; do 
    fn="${fn#* }" 
    arr+=("${fn% *}") 
done < <(command) 
+1

這是完全正確的答案。謝謝!我會相應地更新問題。 –

+1

如果文件名*不能包含空格,這兩個選項都是唯一可行的。如果可以,那麼更仔細的解析就需要工作。 –

+0

好點,Etan。在這種情況下,我約99.99%確定文件名不會包含空格,但我想我不能確定未來。你有更強大的建議,可以處理fileenames中的空格嗎?我很樂意從中吸取教訓! –