17

Guys How can I make this work

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

I don't want to store the array in any temporary variable. How can we directly operate on this array.

so to get the 1st element of that array

echo ${$(`find /xyz/abc/music/ |grep def`)[0]} Please help me How I can achieve this

0

5 Answers 5

31

Put the call to find in array brackets

X=( $(find /xyz/abc/music/ | grep def) )
echo ${X[1]}
echo ${X[2]}
echo ${X[3]}
echo ${X[4]}
Sign up to request clarification or add additional context in comments.

3 Comments

This is the one for me. I've looked at quite a few Q's on SO about getting grep results into an array and I find the word 'elegant' showing up a lot in a negative context as an unattainable criterion… this is pretty much the exemplar of a solution that actually meets the definition of elegant and accomplishes the task in one line. Most of the answers are "There's not a good way to do this"… "of a lot of roundabout methods…" Thank you! +1
echo$(om01 thoughts) :)
Doesn't quite answer the question, since it puts the value into a variable, but was useful for what I needed.
14

If you just need the first element (or rather line), you can use head:

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

If you need access to arbitrary elements, you can store the array first, and then retrieve the element:

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

but this will not put each line of grep output into a separate element of an array.

If you care for whole lines instead of words, you can use head and tail for this task, like so:

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

3 Comments

thanks for the comment but I want to get other elements too. I want to do operations like an array
Why do you say each line of grep will not go into separate array elements?
Because each word will. At least in the example I gave;)
8

Even though a bit late, the best solution should be the answer from Ray, but you'd have to overwrite the default field separator environment variable IFS to newline for taking complete lines as an array field. After filling your array, you should switch IFS back to the original value. I'll expand Rays solution:



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


Hope this helps

1 Comment

Good point, especially if you have blanks in your filenames. A somewhat nicer way to set IFS, however, is by using the syntax IFS=$'\n'.
1

this will work

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

Comments

0

Do you mean to get the first line of the output?

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.