2012-02-26 12 views
43

muszę przypisać wyników z grep do tablicy ... na przykładJak przypisać wyjście polecenia do tablicy?

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

Spowodowało bandą linie z numerami linii, w której termin wyszukiwania został znaleziony.

1 
3 
12 
19 

Jaki jest najłatwiejszy sposób przypisania ich do tablicy bash? Jeśli po prostu przypiszę je do zmiennej, staną się ciągiem oddzielonym spacją.

+0

patrz [to pytanie] (http://stackoverflow.com/questions/971162/how-to-initialize-a-bash-array-with-output-piped-from-another-command) – beerbajay

+0

Struny oddzielone spacjami są łatwo dostępne w bashu. –

+0

ooh ... powinien przeszukiwać dokładniej. Dzięki. –

Odpowiedz

93

Aby przypisać wyjście do tablicy, trzeba użyć podstawienia polecenia wewnątrz przypisania tablicy.

Wewnętrzna $() uruchamia polecenie, podczas gdy zewnętrzna() powoduje, że wyjście jest tablicą. Problem polega na tym, że nie będzie działać z plikami zawierającymi spacje. Aby sobie z tym poradzić, możesz ustawić IFS na \ n.

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

można również odciąć potrzeby sed wykonując rozszerzenie dla każdego elementu macierzy:

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

plus jeden do traktowania sprawy z białymi znakami w elementach. Dokładnie to, czego szukałem. –

+1

Rzeczy IFS są świetne! Szukałem godzin! – Drutten

+1

to jest niesamowite, dokładnie to, czego potrzebowałem! –

4

przestrzeni oddzielonych łańcuchy są łatwo przesuwny w bashu.

# 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 

jeśli myślisz miejsca w polu Nazwa pliku użytku find . -printf "\"%p\"\n"

+2

Ale zepsuty dla plików ze spacjami. – jordanm

+0

@jordanm użyj 'find. -printf "\"% p \ "\ n" ' –

+0

Dzięki! Btw, myślę, że brakowało ci średnika w 'for x in $ output do echo $ x; done; ' –

Powiązane problemy