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
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.
Vous avez besoin de $ () pour la substitution de variable dans grep
cpLines=$(grep -n -m 1 $VAR $MYDIR/Configuration.xml |cut -f1 -d: )
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
).
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)
Essayez de faire pipi;
grep -P 'SEARCH TERM' fileName.txt | wc -l