2011-08-24 12 views
8

chicos ¿Cómo puedo hacer este trabajosalida de grep en la matriz

`Encontrar/xyz/abc/música/| grep def`

no quiero para almacenar la matriz en cualquier variable temporal. ¿Cómo podemos operar directamente en este conjunto?

Así que para conseguir el primero elemento de esa gama

echo $ {$ (`find/xyz/abc/música/| grep def`) [0]} Por favor, ayúdame ¿Cómo puedo lograr este

+0

Es necesario utilizar una variable. –

Respuesta

9

Si sólo necesita el primer elemento (o más bien la línea), puede utilizar head:

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

Si necesita acceder a los elementos arbitrarios, se puede almacenar la matriz primero, y luego recuperar el elemento:

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

pero esto no va a poner cada línea de salida grep en un elemento separado de una matriz.

Si usted cuida de líneas completas en lugar de palabras, puede utilizar head y tail para esta tarea, así:

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

gracias por el comentario, pero también quiero obtener otros elementos. Quiero hacer operaciones como una matriz – newbietester

+0

actualicé la respuesta con una solución diferente –

+0

¿Por qué dices que cada línea de grep no entrará en elementos de matriz separados? –

16

Poner la llamada de encontrar en los soportes de matriz

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

Este es el indicado para mí. He visto bastantes Q en SO sobre cómo obtener resultados grep en una matriz y encuentro que la palabra "elegante" aparece mucho en un contexto negativo como un criterio inalcanzable ... esto es más o menos el ejemplo de una solución que en realidad cumple con la definición de "elegante" y cumple la tarea en una línea. La mayoría de las respuestas son "No hay una buena manera de hacer esto" ... "de muchos métodos indirectos ..." ¡Gracias! +1 – om01

+0

echo $ (om01 thoughts) :) –

0

Do ¿Quieres llegar a la primera línea de la salida?

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

Aunque un poco tarde, la mejor solución debería ser la respuesta de Ray, pero que tendría que sobrescribir los IFS variable de entorno separador de campo predeterminado de salto de línea para la toma de líneas completas como un campo de matriz. Después de llenar su matriz, debe volver a cambiar el IFS al valor original. Voy a ampliar solución Rayos:

 


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

 

Esperanza esto ayuda

+0

Buen punto, especialmente si tiene espacios en blanco en sus nombres de archivo. Sin embargo, una forma un tanto más agradable de establecer IFS es mediante el uso de la sintaxis IFS = $ '\ n'. –

1

esto funcionará

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