it-swarm.com.de

grep auf eine Variable

Angenommen, ich habe eine Variable

line="This is where we select from a table."

jetzt möchte ich herausfinden, wie oft die Auswahl im Satz vorkommt.

grep -ci "select" $line

Ich habe das versucht, aber es hat nicht funktioniert. Ich habe es auch versucht

grep -ci "select" "$line"

Es funktioniert immer noch nicht. Ich erhalte den folgenden Fehler.

grep: This is where we select from a table.: No such file or directory
69
gkmohit

Lassen Sie grep die Standardeingabe lesen. Los geht's mit einer Pfeife ...

$ echo "$line" | grep select

... oder eine hier Zeichenfolge ...

$ grep select <<< "$line"

Möglicherweise möchten Sie vor dem Greppen auch Leerzeichen durch Zeilenumbrüche ersetzen:

$ echo "$line" | tr ' ' '\n' | grep select

... oder Sie könnten grep bitten, nur die Übereinstimmung auszudrucken:

$ echo "$line" | grep -o select

Auf diese Weise können Sie den Rest der Zeile entfernen, wenn eine Übereinstimmung vorliegt.

Edit: Ups, lies ein bisschen zu schnell, danke Marco . Um die Vorkommen zu zählen, leiten Sie einfach eines dieser Ereignisse an wc(1) ;)

Eine weitere Änderung, die nach dem Kommentar von lzkata vorgenommen wurde und bei Verwendung von echo$line Zitiert.

102
John WH Smith
test=$line i=0
while case "$test" in (*select*)
test=${test#*select};;(*) ! :;;
esac; do i=$(($i+1)); done

Sie müssen grep für eine so einfache Sache nicht aufrufen.

Oder als Funktion:

occur() while case "$1" in (*"$2"*) set -- \
        "${1#*"$2"}" "$2" "${3:-0}" "$((${4:-0}+1))";;
        (*) return "$((${4:-0}<${3:-1}))";;esac
        do : "${_occur:+$((_occur=$4))}";done

Es dauert 2 oder 3 Argumente. Wenn Sie mehr als das bereitstellen, werden die Ergebnisse verzerrt. Sie können es verwenden wie:

_occur=0; occur ... . 2 && echo "count: $_occur"

... die die Anzahl der Vorkommen von . in ... ausgibt, wenn sie mindestens zweimal vorkommt. So was:

count: 3

Wenn $_occur Beim Aufrufen entweder leer oder unset ist, hat dies keinerlei Auswirkungen auf Shell-Variablen und return 1, wenn "$2" In "$1" Weniger als "$3" Mal. Wenn es nur mit zwei Argumenten aufgerufen wird, wird return 1 nur dann angezeigt, wenn "$2" Nicht in "$1" Ist. Andernfalls wird 0 zurückgegeben.

Und so können Sie in seiner einfachsten Form Folgendes tun:

occur '' . && echo yay || echo shite

... was druckt ...

shite

...aber...

occur . . && echo yay || echo shite

... wird drucken ...

yay

Sie können es auch etwas anders schreiben und die Anführungszeichen um $2 In der Anweisung (*"$2"*) Und "${1#*"$2"}" Weglassen. Wenn Sie dies tun, können Sie Shell-Globs für Übereinstimmungen wie sh[io]te Für den Übereinstimmungstest verwenden.

7
mikeserv