2016-03-23 16 views
1

Ich arbeite derzeit an der Erstellung einer Datenbank in bash. Ich möchte eine "und" -Funktion hinzufügen. Diese Funktion sucht nach zwei Dingen und gibt nur Dinge zurück, die mit beiden Suchen übereinstimmen. Wie würde ich das erreichen?Grep mehrere Dinge außerhalb der Reihenfolge

Hier ist mein Code:

#!/bin/bash 

clear 

#return all 
function all { 
    cat people.dat 
} 
#return some 
function search { 
    grep -i "$SEARCH" people.dat || echo "search returned nothing" 
} 
#or search 
function or { 
    egrep -i "$search1|$search2" people.dat 
} 
#and search 
function and { 
    if [[ $(grep -i "$search1") = $(grep -i "$search2") ]]; then 
     echo yes 
     #that is temporary I want to see if it worked 
    fi 
} 
#return null 
function null { 
    return 
} 

while [ true ] 
do 
    #get the search 
    read SEARCH 

    #search 
    if [[ $SEARCH == *" OR "* ]]; then 
     search1=${SEARCH%" OR "*} 
     search2=${SEARCH##*" OR "} 
     or 
    elif [[ $SEARCH == *" AND "* ]]; then 
     search1=${SEARCH%" AND "*} 
     search2=${SEARCH##*" AND "} 
     and 
    elif [ "$SEARCH" = "all" }; then 
     all 
    elif [ "$SEARCH" = "exit" ]; then 
     exit 
    elif [ "$SEARCH" = "" ]; then 
     null 
    else 
     search 
    fi 
done 
+0

Ist das Hausaufgaben behandeln? Ich hoffe wirklich, dass Sie keine Produktionsdatenbank in Bash implementieren wollen ... – l0b0

+0

Sie können sed wie folgt verwenden: 'sed -n"/$ a/{/ $ b/p} "' für AND und 'sed - n "/ $ a \ | $ b/p" 'für OR – andlrc

+0

Können sich die Suchzeichenfolgen überschneiden? Beispiel: 'search1 =" a b "' 'search2 =" bc "' string = "a b c". Hier wird 'grep" $ {search1}. * $ {Search2} "<<<" $ {string} "' fehlschlagen. –

Antwort

0

Rohr der Ausgang des ersten grep als Eingabe an die zweite grep. Es werden nur die Zeilen mit den Nummern $search1 und $search2 zurückgegeben.

function and { 
    if [[ $(grep -i "$search1" people.dat | grep -i "$search2") ]]; then 
     echo yes 
    fi 
} 
+0

Danke, das hat mir sehr geholfen. :) – Luke

0

@munircontractor is on the right track. Sie können es sogar noch einfacher:

function and { 
    if grep -i "$search1" people.dat | grep -qi "$search2"; then 
     echo yes 
    fi 
} 

Der Ausgang der ersten grep wird leer sein, wenn nichts übereinstimmt, wird der Exit-Code ignoriert, und der Ausgang wird durch die Leitung geschickt werden. Die zweite grep hört auf zu suchen, sobald sie eine Übereinstimmung findet, wird nichts drucken, und ob sie etwas findet oder nicht, wird den Exit-Code der gesamten Pipeline bestimmen.

Weitere Tipps:

  • können Sie verwenden einfach while true
  • Sie wollen wahrscheinlich read -r verwenden, um zu vermeiden Schrägstriche als entkommen Sonderzeichen
Verwandte Themen