2010-06-23 8 views
14

Je script qui ressemble à ceComment faire AWK utiliser la variable créée dans Bash Script

#!/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. 

Ce que je veux faire ci-dessus est d'imprimer dans AWK la variable appelée « BASEN » créée avant. Mais d'une manière ou d'une autre, il a échoué à faire ce que j'espérais.

Ainsi, par exemple myfile.txt contiennent ces lignes

foo bar bax 
foo qux bar 

Avec le script bash ci-dessus, j'espère obtenir

myfile bax 
myfile bar 

Quelle est la bonne façon de le faire?

Répondre

12

Vous pouvez l'utiliser comme ceci.

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

Vous devez utiliser

"$ {i} '"

à AWK pour utiliser le

$ i

créé dans Bash Scr ipt.

+2

utilise '$()' au lieu de guillemets. Et 'find' avec la boucle' for' comme ça va casser des fichiers avec des espaces. Citez votre variable '$ 1' – ghostdog74

2

La raison en est que les variables bash (variables d'environnement) ne sont pas développées dans des chaînes à guillemets simples. Essayez de remplacer

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

avec

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

il y a une gemme juste là :) merci DavidZ! – Deian

29

Le drapeau -v est de la définition des variables à partir de la ligne de commande. Essayez quelque chose comme ceci:

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

+1 C'est la meilleure façon d'injecter une variable car elle fonctionnera même si '$ basen' contient des caractères spéciaux comme des apostrophes, des guillemets ou des espaces. –

1

La manière la plus simple est de créer une variable awk. awk -v awkvar=$bashvar 'awkscript'.

+0

vous devrez mettre' awkvar = $ bashvar' sous les guillemets doubles, sinon il y aura des problèmes avec les variables bashvariables avec des espaces: 'awk -v" awkvar = $ bashvar "'awkscript'' – syss

4

vous pouvez juste faire tout awk

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

En supposant que vous exécutez awk comme le sous-processus de la coquille vous déclarez les vars
dans la coquille

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"]; 
}' 

Résultat:

Lecture des valeurs à l'intérieur awk: quel que soit

avis sur l'importance de l'exportation . Sans cela, les variables de la coque sont considérées comme locales et ne sont pas transmises aux co-processus.

Questions connexes