Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: Bash grep en opslaan  (gelezen 1600 keer)

Bash grep en opslaan
« Gepost op: 2013/12/05, 14:58:57 »
L.S.

In een bash script gebruik ik de volgende code:

gevondenbestanden=[]
$w=”zoekwoord”
grep -l $w *

Ik krijg dan keurig alle bestandsnamen waarin $w voorkomt op mijn scherm. Maar hoe krijg ik die bestandsnamen één voor één in de array gevondenbestanden[]? Ik heb het gevoel dat er een simpele oplossing moet zijn, maar kom er na veel zoeken en lezen niet uit. Iemand met een oplossing?

Re: Bash grep en opslaan
« Reactie #1 Gepost op: 2013/12/05, 15:01:08 »
Kleine typo. De code moet natuurlijk zijn:

gevondenbestanden=[]
w=”zoekwoord”
grep -l $w *

Offline Johan van Dijk

  • Administrator
    • johanvandijk
Re: Bash grep en opslaan
« Reactie #2 Gepost op: 2013/12/05, 16:55:17 »
Probeer dit eens:
w=”zoekwoord”
readarray gevondenbestanden < <(grep "$w" *)

Overigens zit het readarray nog niet zo heel  lang in Bash, dus kan je problemen krijgen op andere/oudere versies van Linux.
Wil je het compatibel houden met andere shells (denk aan Dash of Zsh), dan is het handiger om alleen standaardcommando's te gebruiken.

Denk dan aan zoiets:
grep "$w" * | while read -r line ; do
    echo "Processing $line"
    #hier je code
done

Re: Bash grep en opslaan
« Reactie #3 Gepost op: 2013/12/05, 19:39:04 »
Dank voor de reactie. Ik ga er meer aan de slag.

Offline Johan van Dijk

  • Administrator
    • johanvandijk
Re: Bash grep en opslaan
« Reactie #4 Gepost op: 2013/12/05, 20:11:37 »
Ik zie net dat ik de -l optie van grep vergeten was, maar dat had je vast al wel gezien ;)

Re: Bash grep en opslaan
« Reactie #5 Gepost op: 2013/12/06, 10:50:40 »
Had ik gezien!

Re: Bash grep en opslaan
« Reactie #6 Gepost op: 2013/12/08, 16:22:48 »
Beste Johan van Dijk,

Helaas gaven ook deze codes niet het gewenste eindresultaat. Na lang in de boeken turen vond ik deze oplossing:

# alle bestandsnamen in de huidige directory worden opgeslagen in de array allebestanden[]
allebestanden=(*)
allebestanden=("${allebestanden[@]##*/}")
# read zoekwoord
printf "\n\nTyp een zoekwoord en bevestig met Enter: "
read zoekwoord
# grep zoekt naar $zoekwoord en slaat de bijbehorende bestandsnaam op in gevondenbestanden[]
n=0
for ((i=0; i<${#allebestanden[@]}; i++)); do
interimbestand=${allebestanden[$i]}
grep -q $zoekwoord $interimbestand
# asl de exitwaarde 0 is dan heeft grep het zoekwoord gevonden
if [ $? = 0 ]; then ${gevondenbestanden[$n]}=$interimbestand; let " n += 1 "; fi
done
#check
for ((i=0; i<${#gevondenbestanden[@]}; i++)); do printf "\n${gevondenbestanden[$i]}"; done

Het lijkt mij nog steeds een beetje omslachtig, maar het werkt en daar gaat het uiteindelijk om. Als er verder geen alternatieven binnenkomen, beschouw ik deze draad als opgelost.

Vr.Gr.

N.L.


Offline Johan van Dijk

  • Administrator
    • johanvandijk
Re: Bash grep en opslaan
« Reactie #7 Gepost op: 2013/12/08, 19:36:42 »
Ik snap nog steeds niet waarom je deze omslachtige code wil gebruiken. "grep -l" doet toch precies wat je wil?
En waarom wil je per se met array's werken? Kan je niet beter de uitvoer van grep pipen naar een while loop die voor ieder resultaat er wat leuks mee doet?

Re: Bash grep en opslaan
« Reactie #8 Gepost op: 2013/12/09, 14:52:34 »
De kwestie is dat ik de door grep gevonden bestandsnamen in een array wil brengen om deze later aan te kunnen roepen. Met alleen “grep -l” krijg ik die bestandsnamen weliswaar op het scherm afgedrukt, maar niet in een array. Vandaar die for-loop met een exitwaarde-controle. Of die code korter kan via piping ga ik verder uitproberen. Vooralsnog werkt een en ander. Dank voor de respons.

Re: Bash grep en opslaan
« Reactie #9 Gepost op: 2013/12/10, 09:04:46 »
# read zoekwoord
printf "\n\nTyp een zoekwoord en bevestig met Enter: "
read zoekwoord
# grep zoekt naar $zoekwoord en slaat de bijbehorende bestandsnaam op in gevondenbestanden[]
n=0
ls * | while read x; do
grep -q $zoekwoord $x && gevondenbestanden() += "$x"
done
#check
for x in gevondenbestanden; do echo $x; done;
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Re: Bash grep en opslaan
« Reactie #10 Gepost op: 2013/12/10, 15:51:33 »
Dank voor het alternatief. Ik kan er mee uit de voeten.

Vr.Gr.