2009-11-30 12 views
5
#!/bin/bash 

for ((var=0; var<20; var++)) 
do 
echo " Number is: $(grep 'Multiple_Frame = echo **$var**' 20mrf.txt | wc -l)" >>statisic.txt 

done 

Das Shell-Programm kann nicht korrektes Ergebnis erzeugen, die vielleicht der Grund für falschen Variable in dem zweiten grep Befehl zurückkehrt.Wie grep eine Variable im Shell-Programm?

Wie kann ich grep eine Variable innerhalb des zweiten Echo Satz? verschiedene Dinge nach der Var-Änderung zu grepsen?

Vielen Dank!

Antwort

4

Wie andere festgestellt haben, ist das Problem, dass die einfachen Anführungszeichen die Expansion der Variablen verhindern. Allerdings $() Verwendung können Sie doppelte Anführungszeichen verwenden:

echo " Number is: $(grep "Multiple_Frame = echo **$var**" 20mrf.txt | wc -l)" >>statisic.txt 

obwohl ich so etwas vermuten, dass dieses ist, was Sie gemeint:

echo " Number is: $(grep "Multiple_Frame = $var" 20mrf.txt | wc -l)" >>statisic.txt 

Sie sollten sich auch bewusst sein, dass grep eine Option zur Ausgabe hat die zählen so können Sie wc auslassen:

echo " Number is: $(grep -c "Multiple_Frame = $var" 20mrf.txt)" >>statisic.txt 
1

Sie haben in einer Variablen jede Substitution zu speichern. Wie folgt aus:

#!/bin/bash 

for ((var=0; var < 20; var++)) 
do 

count=`grep "Multiple_Frame = $var" 20mrf.txt | wc -l` 
echo " Number is: $count" >> statisic.txt 

done
+0

nachdem ich den Befehl als das geteilt habe, was Sie mir gesagt haben, bekomme ich die folgenden Fehlerinformationen. ./loop_count_reference_frame_no.sh: Zeile 10: grep "Multiple_Frame = $ var" 20mrf.txt | wc -l: Befehl nicht gefunden – MaiTiano

+0

vielleicht kann das einfache Zitat kein korrektes grep-Ergebnis erzeugen und es an die neue "count" -Variable senden. – MaiTiano

+0

Ich weiß, was ist der falsche Ort ... Ich sollte ESC nicht einfache einfache Zitat verwenden. Danke trotzdem. – MaiTiano

0

Der String in $ (...) mit einfachen Anführungszeichen zitiert ('...') dieser unter Angabe verhindert, dass die variable Expansion. Verwenden Sie stattdessen doppelte Anführungszeichen. In Ihrem Fall:

#!/bin/bash 

for ((var=0; var<20; var++)) 
do 
echo " Number is: $(grep 'Multiple_Frame = echo **'"$var"'**' 20mrf.txt | wc -l)" >>statisic.txt 

done 

Beachten Sie, dass in diesem Beispiel, es ist wie die doppelten Anführungszeichen für den echo Befehl scheint bereits geöffnet, aber Sie sollten beachten, dass die $(...) zuerst ausgewertet wird, und es gibt keine doppelten Anführungszeichen im Innern . Die Änderung besteht also darin, das einfache Zitat des offenen Anführungsstrichs grep zu schließen und die Anführungszeichen zu schließen und das Anführungszeichen später wieder zu öffnen.

Dieser langwierige Erklärung zeigt den Vorteil der Ausdruck auseinander zu brechen, wie sie von anderen Antworten vorgeschlagen.

+0

schließendes einzelnes Zitat von grep kann es nicht helfen, ein korrektes Ergebnis zu produzieren. trotzdem, danke ~ – MaiTiano

1

Ok, das zweite [sic] Problem ist mit Angabe der Linie 5. Der Verweis auf $ var wird nie erweitert werden, weil sie in einfachen Anführungszeichen enthalten ist. Sie können das beheben, indem Sie die einfachen Anführungszeichen (') durch doppelte Escapezeichen (\") ersetzen.

Das erste [sic] Problem ist, dass Sie in einer einzigen Zeile zu viel zu tun, was bewirkt, dass Ihr Verschachtelung Problem mit Anführungszeichen versuchen. Teilen Sie die Zeile in mehrere Befehle auf und speichern Sie die Zwischenergebnisse nach Bedarf. Ja, es könnte ein bisschen langsamer laufen, aber Sie werden eine Menge Zeit sparen Debugging und Wartung.

Traders zweites Gesetz: Wenn Sie zwischen der Optimierung der Leistung und der Optimierung der Wartbarkeit wählen müssen, entscheiden Sie sich IMMER dafür, Ihren Code wartbarer zu machen. Computer werden immer schneller; Programmierer nicht.

2

@OP, zu tun, was Sie tun, dass w ay ist ziemlich ineffizient. Sie rufen grep und wc 20 Mal in derselben Datei auf. Öffnen Sie die Datei nur einmal und erhalten Sie alle gewünschten Dinge in einer Iteration des Dateiinhalts. Beispiel in bash 4.0

In ähnlicher Weise können Sie assoziative Arrays in gawk verwenden, um Ihnen bei dieser Aufgabe zu helfen.

gawk '/Multiple_Frame =/{ 
    sub(/.*Multiple_Frame = /,"") 
    sub(/ .*/,"") 
    arr["Multiple_Frame = "$0]=arr["Multiple_Frame = "$0]+1 
}END{ 
    for(i in arr) print i,arr[i] 
}' file 
+0

OMG, dein Programm ist erstaunlich. Da ich ein solcher Neuling für diese Linux-Programmierung bin, gibst du mir wirklich eine gute Lektion. Danke. ~ – MaiTiano

Verwandte Themen