Domanda

Devo assegnare i risultati da a grep a un array ... per esempio

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

Ciò ha provocato un sacco di righe con numeri di linea in cui è stato trovato il termine di ricerca.

1
3
12
19

Qual è il modo più semplice per assegnarli a un array di bash? Se li assegno semplicemente a una variabile diventano una stringa separata nello spazio.

È stato utile?

Soluzione

Per assegnare l'output di un comando a un array, è necessario utilizzare una sostituzione del comando all'interno di un incarico di array. Per un comando generale command Sembra:

arr=( $(command) )

Nell'esempio dell'OP, questo avrebbe letto:

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

L'interno $() esegue il comando mentre l'esterno () fa sì che l'output sia un array. Il problema è che non funzionerà quando l'output del comando contiene spazi. Per gestire questo, puoi impostare IFS a \n.

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

Puoi anche eliminare la necessità di SED eseguendo un'espansione su ciascun elemento dell'array:

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

Altri suggerimenti

Le stringhe separate dallo spazio sono facilmente attraversabili in 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 $output | awk '{for(i=1;i<=NF;i++) print $i;}'

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

Se stai pensando allo spazio in nome del file Utilizzo find . -printf "\"%p\"\n"

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top