2014-02-25 9 views
8

ich meine Prüfung zum Testen purpose.During ich Bash-Skript verwende habe in einer Datei die Zeilennummer des ersten Auftretens einer Zeichenfolge zu finden. Ich habe "awk" und "grep" beide versucht, aber keiner von ihnen gibt den Wert zurück.Mit Grep die Zeilennummer des ersten Auftretens der Zeichenfolge in Bash-Shell erhalten

Awk Beispiel

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

dies nicht $ VAR erweitern. Wenn ich den Wert von VAR es funktioniert, aber ich will VAR verwenden

Grep Beispiel

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

dies gibt Fehlerzeile 20: -n: Befehl nicht

gefunden

Antwort

5

Versuchen Sie so etwas wie:

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

In awk wird / /awk Variable wörtlich interpretieren. Sie müssen den Operator match (~) verwenden. Was wir hier machen, sucht nach der Variablen in Ihrer Eingabezeile. Wenn es übereinstimmt, drucken wir die in NR gespeicherte Zeilennummer und beenden es.

-v können Sie eine awk Variable (search) im obigen Beispiel erstellen. Dann weisen Sie ihm Ihre bash Variable zu().

+1

Ich mag diese am besten, weil es nur einen einzigen Prozess verwendet. –

8

Sie benötigen

$() für die Variablensubstitution in grep
cpLines=$(grep -n -m 1 $VAR $MYDIR/Configuration.xml |cut -f1 -d:) 
6
grep -n -m 1 SEARCH_TERM FILE_PATH |sed 's/\([0-9]*\).*/\1/' 

grep schaltet

-n = Zeilennummer enthalten

-m 1 = Spiel ein

sed-Optionen (Stream-Editor) :

's/X/Y/' - X mit Y

\([0-9]*\) ersetzen - regulärem Ausdruck der String abgestimmt übereinstimmen Ziffern Null oder mehrmals aufgetreten ist, Klammer entkommen, mit regulärem Ausdruck in Klammern wird das \ 1 Argument in der Y (Ersatz Zeichenkette)

\([0-9]*\).* - .* passt jedes Zeichen an, das null oder mehrfach vorkommt.

+0

Arbeiten. Vielen Dank. – Ryan

Verwandte Themen