web-dev-qa-db-fra.com

grep sur une variable

Disons que j'ai une variable

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

maintenant je veux grep combien de fois la sélection se produit-elle dans la phrase.

grep -ci "select" $line

J'ai essayé ça, mais ça n'a pas marché. J'ai aussi essayé

grep -ci "select" "$line"

Ça ne marche toujours pas. J'obtiens l'erreur suivante.

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

Demandez à grep de lire sur son entrée standard. Voilà, en utilisant n tuya ...

$ echo "$line" | grep select

... ou ne chaîne ici ...

$ grep select <<< "$line"

En outre, vous souhaiterez peut-être remplacer les espaces par des sauts de ligne avant de lancer une grepping:

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

... ou vous pouvez demander à grep d'imprimer uniquement la correspondance:

$ echo "$line" | grep -o select

Cela vous permettra de vous débarrasser du reste de la ligne en cas de match.

Edit: Oups, lisez un peu trop vite, merci Marco . Afin de compter les occurrences, il suffit de diriger n'importe lequel de ces événements vers wc(1) ;)

Une autre modification effectuée après le commentaire de lzkata , citant $line Lors de l'utilisation de echo.

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

Vous n'avez pas besoin d'appeler grep pour une chose aussi simple.

Ou en fonction:

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

Cela prend 2 ou 3 arguments. Fournir plus que cela faussera ses résultats. Vous pouvez l'utiliser comme:

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

... qui affiche le nombre d'occurrences de . dans ... si cela se produit au moins 2 fois. Comme ça:

count: 3

Si $_occur est soit vide, soit unset lorsqu'il est invoqué, il n'affectera aucune variable Shell et return 1 si "$2" se produit dans "$1" moins que "$3" fois. Ou, s'il est appelé avec seulement deux arguments, il ne sera return 1 que si "$2" n'est pas dans "$1". Sinon, il renvoie 0.

Et donc, dans sa forme la plus simple, vous pouvez faire:

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

... qui imprime ...

shite

...mais...

occur . . && echo yay || echo shite

... imprimera ...

yay

Vous pouvez également l'écrire un peu différemment et omettre les guillemets autour de $2 dans les deux (*"$2"*) et "${1#*"$2"}" déclaration. Si vous faites cela, vous pouvez utiliser des globes Shell pour des correspondances comme sh[io]te pour le test de correspondance.

7
mikeserv