web-dev-qa-db-fra.com

Utiliser grep pour obtenir le numéro de ligne de la première occurrence d'une chaîne dans un fichier

J'utilise le script bash à des fins de test. Au cours de mes tests, je dois trouver le numéro de ligne de la première occurrence d'une chaîne dans un fichier. J'ai essayé "awk" et "grep" tous les deux, mais aucun d'eux ne retourne la valeur.

Awk exemple

#/!bin/bash
....
VAR=searchstring
...
cpLines=$(awk '/$VAR/{print NR}' $MYDIR/Configuration.xml

cela n'augmente pas $ VAR. Si j'utilise la valeur de VAR cela fonctionne, mais je veux utiliser VAR

Exemple Grep

#/!bin/bash
...
VAR=searchstring    
...
cpLines=grep -n -m 1 $VAR $MYDIR/Configuration.xml |cut -f1 -d: 

cela donne la ligne d'erreur 20: -n: commande non trouvée

13
user1651888
grep -n -m 1 SEARCH_TERM FILE_PATH |sed  's/\([0-9]*\).*/\1/'

commutateurs grep

-n = inclure le numéro de ligne

-m 1 = correspond à un

options sed (éditeur de flux):

's/X/Y/' - remplace X par Y

\([0-9]*\) - expression régulière correspondant aux chiffres zéro ou plusieurs fois, parenthèses échappées, la chaîne correspondant à l'expression rationnelle entre parenthèses sera l'argument\1 du Y (chaîne de remplacement)

\([0-9]*\).* - .* correspond à tout caractère survenant zéro ou plusieurs fois.

10
enterx

Vous avez besoin de $ () pour la substitution de variable dans grep

cpLines=$(grep -n -m 1 $VAR $MYDIR/Configuration.xml |cut -f1 -d: )
8
Raul Andres

Essayez quelque chose comme: 

awk -v search="$var" '$0~search{print NR; exit}' inputFile

Dans awk, / / interprétera la variable awk littéralement. Vous devez utiliser l'opérateur match (~). Nous cherchons ici la variable par rapport à votre ligne de saisie. Si cela correspond, nous imprimons le numéro de ligne stocké dans NR et quittons. 

-v vous permet de créer une variable awk (search) dans l'exemple ci-dessus. Vous lui affectez ensuite votre variable bash ($var). 

5
jaypal singh
grep -n -m 1 SEARCH_TERM FILE_PATH | grep -Po '^[0-9]+'

explication: 

 -Po = -P -o

-P utilise l'expression rationnelle Perl

-o affiche uniquement la chaîne correspondante (pas la ligne entière)

0
jiangdongzi

Essayez de faire pipi;

grep -P 'SEARCH TERM' fileName.txt | wc -l

0
Joshua Trimm