2011-08-24 11 views
8

Guys W jaki sposób można dokonać tej pracygrep wyjście na tablicy

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

Nie chcę, aby zapisać tablicę w jakikolwiek zmienna tymczasowa. Jak możemy bezpośrednio operować na tej tablicy.

tak aby uzyskać 1st element tej tablicy

echo $ {$ (`find/xyz/abc/muzyka/| grep def`) [0]} Proszę mi pomóc w jaki sposób można osiągnąć to

+0

Musisz użyć zmiennej. –

Odpowiedz

9

Jeśli wystarczy pierwszy element (czy raczej linia), można użyć head:

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

Jeśli potrzebujesz dostępu do dowolnych elementów, ty może przechowywać tablicę, a potem pobrać element:

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

ale to nie będzie można umieścić każdą linię wyjścia grep do oddzielnego elementu tablicy.

Jeśli zależy Ci na całych liniach zamiast słów można użyć head i tail dla tego zadania, tak jak poniżej:

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

dzięki za komentarz, ale chcę też uzyskać inne elementy. Chcę wykonać operacje takie jak tablica – newbietester

+0

zaktualizowałem odpowiedź innym rozwiązaniem –

+0

Dlaczego mówisz, że każda linia grep nie przejdzie do osobnych elementów tablicy? –

16

zawiesić połączenie, aby znaleźć się w nawiasach tablicy

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

To jest dla mnie. Spojrzałem na kilka z Q na temat uzyskiwania wyników grep w tablicy i uważam, że słowo "elegant" pojawia się w negatywnym kontekście jako nieosiągalne kryterium ... jest to właściwie przykład rozwiązania, które faktycznie spełnia definicję elegancji _i_ realizuje zadanie w jednej linii. Większość odpowiedzi brzmi: "Nie ma na to dobrego sposobu" ... "na wiele metod ronda ..." Dziękujemy! +1 – om01

+0

echo $ (om01 myśli) :) –

0

Do masz na myśli pierwszy wiersz wyjścia?

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

Chociaż trochę późno, najlepszym rozwiązaniem powinna być odpowiedź od Ray, ale trzeba by nadpisać domyślne pól IFS zmiennym otoczeniu separator do NEWLINE podejmowania kompletne linie jako pola tablicy. Po wypełnieniu tablicy, powinieneś przełączyć IFS z powrotem na oryginalną wartość. Będę rozwijać rozwiązanie Rays:

 


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

 

Nadzieja to pomaga

+0

Dobra uwaga, zwłaszcza jeśli w nazwach plików występują spacje. Jednak nieco ładniejszym sposobem na ustawienie IFS jest użycie składni IFS = $ '\ n'. –

1

to zadziała

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