2017-02-28 3 views
-2

Ich möchte ein Bash-Skript machen, um mit grep nach Zeilen zu suchen, die mehrere Muster haben (Groß-/Kleinschreibung nicht beachten). Ich möchte ein Bash-Skript erstellen, die ich verwenden kann, wie folgt:Funktion zum Suchen mehrerer Muster mit Hilfe von grep

myscript file.txt pattern1 pattern2 pattern3 

und es sollte erhalten traslated:

grep -i --color=always pattern1 file.txt | grep -i pattern2 | grep -i pattern3 

Ich habe versucht folgende Bash-Skript, aber es funktioniert nicht:

#!/bin/bash 
grep -i --color=always $2 $1 | grep -i $3 | grep -i $4 | grep -i $5 | grep -i $6 | grep -i $7 

Der Fehler ist:

Usage: grep [OPTION]... PATTERN [FILE]... 
Try 'grep --help' for more information. 
Usage: grep [OPTION]... PATTERN [FILE]... 
Try 'grep --help' for more information. 
Usage: grep [OPTION]... PATTERN [FILE]... 
Try 'grep --help' for more information. 
Usage: grep [OPTION]... PATTERN [FILE]... 
Try 'grep --help' for more information. 
+0

Aber was ist das Ziel dieser? –

+0

Wollen Sie * undefined * Anzahl der Muster? –

+0

Ja. Das Bash-Skript sollte in der Lage sein, mit dem ersten Dateinamenargument und dann mit einer variablen Anzahl von Musterargumenten zu arbeiten (sollte in der Lage sein, mindestens 6 Muster zu verarbeiten - im Idealfall eine beliebige Zahl). – rnso

Antwort

1

Ich denke, man kann eine rekursive Funktion tun:

search() { 
    if [ $# -gt 0 ]; then 
     local pat=$1 
     shift 
     grep "$pat" | search "[email protected]" 
    else 
     cat 
    fi 
} 

In Ihrem Skript Sie diese Funktion aufrufen würde und die Suchmuster als Argumente übergeben. Sagen Sie, dass $1 die Datei und den Rest der Argumente Muster werden dann würden Sie

file=$1 
shift 
cat "$file" | search "[email protected]" 
+0

Wie wird die Suchfunktion im Bash-Skript verwendet? – rnso

+0

@rnso Ich bearbeitet, um die Verwendung anzuzeigen. –

+0

Kann es eine Fehlermeldung geben, wenn kein oder nur 1 Argument eingegeben wurde? – rnso

-1

tun Wenn Sie weglassen ein Argument oder andere am Ende, so dass $ 3 usw. fehlen wird, dann einige grep Befehl kein Argument erhalten und wird winseln.

1

Wenn Sie GNU awk haben, können Sie

awk 'BEGIN {IGNORECASE=1} /pattern1/ && /pattern2/ && /pattern3/' file.txt 

EDIT: Sie können dies wie folgt in einem Skript verwenden:

inputfile="$1" 
shift 
awk -f <(echo "BEGIN {IGNORECASE=1}"; printf " /%s/ &&" $* | sed 's/&&$//') "${inputfile}" 
+0

"awk 'BEGIN {IGNORECASE = 1}/$ 2/&&/$ 3/&&/$ 4 /' $ 1" funktioniert nicht in einem Bash-Skript. Auch wenn nur 2 Muster gesendet werden? Ich möchte, dass es mit einer variablen Anzahl von Mustern umgehen kann, die gesendet werden können. – rnso

+0

Ich habe die Antwort bearbeitet, um zu zeigen, dass es in einem Skript mit einer variablen Anzahl von Argumenten behandelt wird. –

Verwandte Themen