2010-06-23 7 views
14

I-Skript, das wie das, was ich tun möchte, überWie AWK machen verwenden Sie das Variable in Bash-Skript erstellt

#!/bin/bash 
#exampel inputfile is "myfile.txt" 
inputfile=$1 
basen=`basename $inputfile .txt` # create basename 

cat $inputfile | 
awk '{print $basen "\t" $3} # this doesn't print "myfile" but the whole content of it. 

aussieht, ist die Variable in AWK auszudrucken ‚basen‘ vor erstellt genannt. Aber irgendwie konnte es nicht tun, was ich mir erhofft hatte.

So zum Beispiel myfile.txt enthalten diese Zeilen

foo bar bax 
foo qux bar 

Mit dem obigen Bash-Skript I

myfile bax 
myfile bar 

Was ist der richtige Weg, es zu tun zu bekommen hoffen?

Antwort

12

Sie es wie folgt verwenden können.

for i in `find $1 -name \*.jar` 
do 
jar tvf $i| awk -F '/' '/class/{print "'${i}'" " " $NF }' >> $classFile 
done 

sollten Sie verwenden

" '$ {i}'"

in AWK die

$ i

erstellt zu verwenden in Bash Scr ipt.

+2

Verwenden Sie '$()' anstelle von Backticks. Und 'find' mit' for' loop wie das bricht Dateien mit Leerzeichen. Zitiere deine '$ 1' Variable – ghostdog74

2

Der Grund dafür ist, dass Bash-Variablen (Umgebungsvariablen) nicht innerhalb von Strings mit einfachen Anführungszeichen erweitert werden. Versuchen

'{print $basen "\t" $3}' 

mit

"{print \"$basen\" \"\t\" \$3}" 
+0

dort ist ein Juwel genau dort :) danke DavidZ! – Deian

29

Ersetzen der -v Flag für Variablen ist aus der Befehlszeile zu setzen. Probieren Sie etwas wie folgt aus:

awk -v "BASEN=$basen" '{print BASEN "\t" $3}' 
+2

+1 Dies ist der beste Weg, um eine Variable zu injizieren, da es funktioniert, auch wenn '$ Basen' Sonderzeichen wie Apostrophe, Anführungszeichen oder Leerzeichen enthält. –

1

Der einfachste Weg ist, eine awk Variable zu erstellen. awk -v awkvar=$bashvar 'awkscript'.

+0

du musst' awkvar = $ bashvar' unter doublequotes setzen, sonst wird es Probleme mit bashvariablen mit Leerzeichen geben: 'awk -v" awkvar = $ bashvar "'awkscript'' – syss

4

können Sie einfach alles in awk

awk '{gsub(".txt","",ARGV[1]);print ARGV[1] "\t" $3}' inputfile.txt 
3

Sie awk laufen Angenommen als Teilprozess der Schale Sie die Vars erklärt
Innerhalb der Schale

export MY_VARS="whatever"; #// IT NEEDS to be exported, to allow the sub process awk read access. 
echo ""| awk '{ 
    print "Reading values from within awk : "ENVIRON["MY_VARS"]; 
}' 

Ergebnis:

Werte lesen aus awk: was auch immer

Mitteilung der Bedeutung des Exports. Ohne es, die Vars aus der Shell wird als lokalen und nicht an die Co-Prozesse übergeben.

Verwandte Themen