2011-08-24 315 views
8

傢伙,我怎樣才能使這項工作grep的輸出到數組

`找到/ XYZ/ABC /音樂/ | grep的def`

我不想存儲在任何陣列臨時變量。我們如何直接在這個數組上運行。

因此要獲得該數組的第1個要素

回聲$ {$('查找/ XYZ/ABC /音樂/ | grep的def`)[0]} 請幫我我怎麼能實現這

+0

您需要使用一個變量。 –

回答

9

如果你只需要第一個元素(或者更確切地說線),你可以使用head

`find /xyz/abc/music/ |grep def | head -n 1` 

如果您需要訪問任意的元素,你可以首先存儲陣列,然後檢索元素:

arr=(`find /xyz/abc/music/ |grep def`) 
echo ${arr[n]} 

但這不會把grep的輸出的每一行成陣列的單獨元件。

如果你關心整個行,而不是的話,你可以使用headtail這個任務,像這樣:

`find /xyz/abc/music/ |grep def | head -n line_number | tail -n 1` 
+0

感謝您的評論,但我也想獲得其他元素。我想做的操作像一個數組 – newbietester

+0

用不同的解決方案更新了答案 –

+0

爲什麼你說grep的每一行不會進入單獨的數組元素? –

16

把呼叫數組括號找到

X=($(find /xyz/abc/music/ | grep def)) 
echo ${X[1]} 
echo ${X[2]} 
echo ${X[3]} 
echo ${X[4]} 
+1

這是我的一個。我已經看過很多關於如何將grep結果導入數組的問題,並且我發現「雅緻」這個詞在負面語境中顯示爲一個難以達到的標準......這實際上就是解決方案的示例符合雅緻的定義並完成一行任務。大部分的答案是「沒有一個很好的方法可以做到這一點......」......有很多迂迴的方法......「謝謝! +1 – om01

+0

echo $(om01 thoughts):) –

0

待辦事項你的意思是獲得輸出的第一行?

find /xyz/abc/music/ |grep def|head 1 
3

即使有點晚了,最好的解決辦法應該是從雷的答案,但你必須覆蓋默認的字段分隔符環境變量IFS爲換行符采取完整的生產線作爲陣列領域。填充陣列後,您應該將IFS切換回原始值。我會擴大光芒的解決方案:

 


    # keep original IFS Setting 
    IFS_BAK=${IFS} 
    # note the line break between the two quotes, do not add any whitespace, 
    # just press enter and close the quotes (escape sequence "\n" for newline won't do) 
    IFS=" 
    " 
    X=($(find /xyz/abc/music/ | grep def)) 
    echo ${X[1]} 
    echo ${X[2]} 
    echo ${X[3]} 
    echo ${X[4]} 
    # set IFS back to normal.. 
    IFS=${IFS_BAK} 

 

希望這有助於

+0

好點,特別是如果你的文件名有空白。但是,設置IFS的更好方法是使用語法IFS = $'\ n'。 –

1

這將工作

array_name=(`find directorypath | grep "string" | awk -F "\n" '{print $1}'`) 
echo $array_name