2012-02-26 19 views
43

necesito para asignar los resultados de un grep a una serie ... por ejemplo¿Cómo asigno la salida de un comando a una matriz?

grep -n "search term" file.txt | sed 's/:.*//' 

Esto dio lugar a un montón de líneas con números de línea en la que se encuentra el término de búsqueda.

1 
3 
12 
19 

¿Cuál es la forma más fácil de asignarlos a una matriz de bash? Si simplemente los asigno a una variable, se convierten en una cadena separada por espacios.

+0

Ver [esta cuestión] (http://stackoverflow.com/questions/971162/how-to-initialize-a-bash-array-with-output-piped-from-another-command) – beerbajay

+0

cadenas separadas por espacios son fácilmente transitables en bash. –

+0

ooh ... debería haber buscado más a fondo. Gracias. –

Respuesta

93

Para asignar la salida a una matriz, es necesario utilizar una sustitución de orden en el interior de una asignación de matrices.

arr=($(grep -n "search term" file.txt | sed 's/:.*//')) 

El interior $() ejecuta el comando mientras que outer() hace que la salida sea una matriz. El problema con esto es que no funcionará con los archivos que contienen espacios. Para manejar esto, puede establecer IFS en \ n.

IFS=$'\n' 
arr=($(grep -n "search term" file.txt | sed 's/:.*//')) 
unset IFS 

También puede cortar la necesidad de sed mediante la realización de una expansión en cada elemento de la matriz:

arr=($(grep -n "search term" file.txt)) 
arr=("${arr[@]%%:*}") 
+3

más uno para tratar el caso con espacios en blanco en los elementos. Exactamente lo que estaba buscando. –

+1

¡El material de IFS es genial! Estado buscando horas! – Drutten

+1

esto es increíble, ¡exactamente lo que necesitaba! –

4

Las cadenas separadas por espacios son fácilmente transitables en bash.

# save the ouput 
output=$(grep -n "search term" file.txt | sed 's/:.*//') 

# iterating by for. 
for x in $output; do echo $x; done; 

# awk 
echo $out | awk '{for(i=1;i<=NF;i++) print $i;}' 

# convert to an array 
ar=($out) 
echo ${ar[3]} # echos 4th element 

si usted está pensando en espacio de nombre de archivo utilización find . -printf "\"%p\"\n"

+2

Pero roto para archivos con espacios. – jordanm

+0

@jordanm use 'find. -printf "\"% p \ "\ n" ' –

+0

Gracias! Por cierto, creo que te perdiste un punto y coma en 'for x in $ output do echo $ x; hecho; ' –

Cuestiones relacionadas