2010-06-23 12 views
14

Şöyle senaryomuz varAWK, Bash Komut Dosyası'nda oluşturulan değişkeni nasıl kullanır?

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

Ne yukarıda yapmak istiyorum AWK içinde önce oluşturulan 'basen' olarak adlandırılan değişken yazdırmak etmektir. Ama bir şekilde, umduğum şeyi yapamadı.

ben

myfile bax 
myfile bar 

bunu yapmak için doğru yolu nedir almak için umut yukarıdaki bash script ile

foo bar bax 
foo qux bar 

bu satırları ihtiva myfile.txt örneğin Yani?

cevap

12

Bunu böyle kullanabilirsiniz.

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

Sen

" '$ {i}'" AWK içinde

$ i

oluşturulan kullanmak için kullanması gereken Bash Scr içinde ut.

+2

backticks yerine '$()' kullanın. '' '' '' '' '' '' '' '' '' '' Ile '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' '' $ 1' değişkenini – ghostdog74

2

Bunun nedeni, bash değişkenlerinin (ortam değişkenleri) tek tırnaklı dizeler içinde genişletilmemesidir. -v bayrak komut satırından değişkenleri ayarlamak içindir

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

Orada bir mücevher var :) teşekkürler DavidZ! – Deian

29

ile

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

değiştirmeyi deneyin. Şunun gibi bir şey deneyin:

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

+1 Bu, $ baseen'nin kesme işaretleri, tırnak işaretleri veya boşluk gibi özel karakterler içeriyor olsa bile çalışacağı için bir değişken enjekte etmenin en iyi yoludur. –

1

En kolay yol bir awk değişkeninin yapılmasıdır. awk -v awkvar=$bashvar 'awkscript'.

+0

'dan alıntı yaparak 'awkvar = $ bashvar'ı çift tırnak içine almanız gerekecek, aksi takdirde içinde boşluk bulunan bashvariables ile ilgili sorunlar olacaktır:' awk -v "awkvar = $ bashvar" 'awkscript' – syss

4

sen sadece kabuğun içerisinde
değişkenler ilan Eğer kabuğun alt süreci olarak awk çalıştırmak varsayarsak awk

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

her şeyi yapabileceği

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

Sonuç:

Okuma değerleri awk içinden: ne olursa olsun

ihbar ihracat önemi. Dışarıda, kabuktan gelen variller yerel olarak kabul edilir ve ortak süreçlere geçmez.

İlgili konular