2014-07-22 15 views
22

Potrzebuję wyszukać wzór w katalogu i zapisać nazwy plików, które go zawierają w tablicy.Przechowuj grep output w tablicy bash

Wyszukiwanie wzorca:

grep -HR "pattern" . | cut -d: -f1 

Drukuje mi wszystkie nazwy plików, które zawierają "wzór".

Gdy próbuję:

targets=$(grep -HR "pattern" . | cut -d: -f1) 
length=${#targets[@]} 
for ((i = 0; i != length; i++)); do 
    echo "target $i: '${targets[i]}'" 
done 

Drukuje tylko jeden element, który zawiera ciąg ze wszystkimi filnames.

output: target 0: 'file0 file1 .. fileN' 

Ale muszę:

output: target 0: 'file0' 
output: target 1: 'file1' 
..... 
output: target N: 'fileN' 

Jak mogę osiągnąć wynik bez robi nudne operację podziału na cele?

Odpowiedz

33

Można użyć:

targets=($(grep -HRl "pattern" .)) 

Uwaga wykorzystanie (...) tworzenia tablicy w bash.

Możesz również użyć grep -l, aby uzyskać tylko nazwy plików w wynikach grep (jak pokazano w moim poleceniu).

+0

spektakularny! Już rzuciłem okiem na opcję "-l", przynosząc świetne przeboje. Czy możesz wyjaśnić, dlaczego działa dodanie dwóch nawiasów? –

+2

To jest składnia tworzenia tablicy w BASH. Jeśli usuniesz zewnętrzny '(..)', to po prostu przypisujesz outout 'grep' do prostej zmiennej powłoki, która nie będzie traktowana jako tablica. – anubhava

+2

nie działa, jeśli nazwa pliku zawiera spacje lub symbole wieloznaczne – lihao