2011-08-24 5 views
8

Guys Làm thế nào tôi có thể làm công việc nàygrep đầu ra vào mảng

`find/xyz/abc/âm nhạc/| grep def`

Tôi không muốn để lưu trữ các mảng trong bất kỳ biến tạm thời. Làm thế nào chúng ta có thể trực tiếp hoạt động trên mảng này.

như vậy để có được các yếu tố 1 của mảng mà

echo $ {$ (`find/xyz/abc/âm nhạc/| grep def`) [0]} Xin hãy giúp tôi như thế nào tôi có thể đạt được này

+0

Bạn cần phải sử dụng một biến. –

Trả lời

9

Nếu bạn chỉ cần phần tử đầu tiên (hay đúng hơn là dòng), bạn có thể sử dụng head:

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

Nếu bạn cần truy cập vào các yếu tố tùy ý, bạn có thể lưu trữ mảng đầu tiên và sau đó truy xuất phần tử:

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

nhưng điều này sẽ không đặt từng dòng đầu vào grep vào thành phần riêng biệt của mảng.

Nếu bạn chăm sóc cho toàn bộ dòng thay lời, bạn có thể sử dụng headtail cho nhiệm vụ này, như vậy:

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

cảm ơn cho nhận xét nhưng tôi cũng muốn có các yếu tố khác. Tôi muốn thực hiện các thao tác như một mảng – newbietester

+0

cập nhật câu trả lời bằng một giải pháp khác –

+0

Tại sao bạn nói mỗi dòng grep sẽ không đi vào các phần tử mảng riêng biệt? –

16

Đặt cuộc gọi để tìm trong ngoặc mảng

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

Đây là một trong tôi. Tôi đã xem xét một vài Q về SO về việc grep kết quả vào một mảng và tôi tìm thấy từ 'thanh lịch' hiển thị rất nhiều trong một ngữ cảnh tiêu cực như là một tiêu chí không thể đạt được ... đây là khá nhiều ví dụ của một giải pháp mà thực sự đáp ứng định nghĩa của _and_ thanh lịch hoàn thành nhiệm vụ trong một dòng. Hầu hết các câu trả lời là "Không có cách nào tốt để làm điều này" ... "của rất nhiều phương pháp vòng xoay ..." Cảm ơn bạn! +1 – om01

+0

echo $ (om01 suy nghĩ) :) –

0

Đỗ bạn có nghĩa là để có được dòng đầu tiên của đầu ra?

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

Mặc dù hơi muộn, giải pháp tốt nhất phải là câu trả lời từ Ray, nhưng bạn phải ghi đè biến môi trường phân cách trường mặc định IFS thành dòng mới để lấy các dòng hoàn chỉnh dưới dạng trường mảng. Sau khi điền mảng của bạn, bạn nên chuyển IFS trở lại giá trị ban đầu. Tôi sẽ mở rộng Rays giải pháp:

 


    # 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

+0

Điểm tốt, đặc biệt nếu bạn có khoảng trống trong tên tệp của mình. Tuy nhiên, cách tốt hơn để đặt IFS là sử dụng cú pháp IFS = $ '\ n'. –

1

này sẽ làm việc

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