2011-08-24 9 views
8

Ragazzi Come posso fare questo lavorouscita grep in matrice

`find/xyz/abc/musica/| grep def`

Non voglio per memorizzare la matrice in qualsiasi variabile temporanea. Come possiamo operare direttamente su questo array.

modo per ottenere il primo elemento di tale matrice

echo $ {$ (`find/xyz/abc/musica/| grep def`) [0]} Please help me Come posso raggiungere questo

+0

È necessario utilizzare una variabile. –

risposta

9

Se avete solo bisogno il primo elemento (o meglio la linea), è possibile utilizzare head:

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

Se è necessario accedere a elementi arbitrari, si può memorizzare la matrice prima, e quindi recuperare l'elemento:

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

ma questo non metterà ogni riga di output grep in un elemento separato di un array.

Se si cura per le linee intere invece di parole, è possibile utilizzare head e tail per questo compito, in questo modo:

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

grazie per il commento ma voglio ottenere anche altri elementi. Voglio fare operazioni come un array – newbietester

+0

aggiornato la risposta con una soluzione diversa –

+0

Perché dici che ogni riga di grep non andrà in elementi di array separati? –

16

Mettere la chiamata di trovare tra parentesi matrice

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

Questo è quello per me. Ho guardato un bel po 'di Q su SO riguardo l'ottenimento di risultati grep in un array e trovo la parola' elegante 'che mostra molto in un contesto negativo come un criterio irraggiungibile ... questo è praticamente l'esempio di una soluzione che in realtà incontra la definizione di elegante _e_ compie il compito in una sola riga. La maggior parte delle risposte sono "Non c'è un buon modo per fare questo" ... "di molti metodi rotondi ..." Grazie! +1 – om01

+0

echo $ (pensieri om01) :) –

0

Do intendi ottenere la prima riga dell'output?

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

Anche se un po 'tardi, la soluzione migliore dovrebbe essere la risposta da Ray, ma che avrebbe dovuto sovrascrivere il campo di default IFS variabile d'ambiente separatore Newline per l'adozione di linee complete come un campo di matrice. Dopo aver riempito l'array, devi riportare l'IFS al valore originale. Io espandere soluzione Raggi:

 


    # 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} 

 

Spero che questo aiuti

+0

Un buon punto, soprattutto se si hanno spazi vuoti nei nomi dei file. Un modo leggermente migliore per impostare IFS, tuttavia, è usando la sintassi IFS = $ '\ n'. –

1

questo funzionerà

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