Bir awk betiğinde kabuk değişkenlerini nasıl kullanabilirim?

Harici kabuk değişkenlerini bir awk betiğine aktarmanın bazı yollarını buldum, ancak ' ve " konusunda kafam karıştı.

Önce bir kabuk betiği ile denedim:

$ v=123test
$ echo $v
123test
$ echo "$v"
123test

Sonra awk denedim:

$ awk 'BEGIN{print "'$v'"}'
$ 123test
$ awk 'BEGIN{print '"$v"'}'
$ 123

Fark neden kaynaklanıyor?

Son olarak bunu denedim:

$ awk 'BEGIN{print " '$v' "}'
$  123test
$ awk 'BEGIN{print ' "$v" '}'
awk: cmd. line:1: BEGIN{print
awk: cmd. line:1:             ^ unexpected newline or end of string 

Bu konuda kafam karıştı.

Çözüm

Kabuk değişkenlerini awk içine alma

çeşitli şekillerde yapılabilir. Bazıları diğerlerinden daha iyidir. Bu, çoğunu kapsamalıdır. Eğer bir yorumunuz varsa, lütfen aşağıya bırakın.


Using -v (En iyi yol, en taşınabilir)

vseçeneğini kullanın: (Not:-vden sonra bir boşluk kullanın, aksi takdirde daha az taşınabilir olacaktır. Örneğin,awk -v var=değilawk -vvar=`)

variable="line one\nline two"
awk -v var="$variable" 'BEGIN {print var}'
line one
line two

Bu, çoğu awk ile uyumlu olmalıdır ve değişken BEGIN bloğunda da kullanılabilir:

Birden fazla değişkeniniz varsa:

awk -v a="$var1" -v b="$var2" 'BEGIN {print a,b}'

Uyarı. Ed Morton'un yazdığı gibi, kaçış dizileri yorumlanacaktır, böylece \t gerçek bir tab olur ve aradığınız şey buysa \t olmaz. ENVIRON[]kullanılarak çözülebilir veyaARGV[]` ile erişilebilir

PS Üç dikey çubuğu ayırıcı olarak ||| seviyorsanız, -F"[|][|][|]" kullanın.

Bir program/fonksiyon hanından awk için veri alma örneği (burada tarih kullanılır)

awk -v time="$(date +"%F %H:%M" -d '-1 minute')" 'BEGIN {print time}'

Kod bloğundan sonra değişken

Burada awk kodundan sonra değişkeni alıyoruz. Bu, BEGIN bloğunda değişkene ihtiyacınız olmadığı sürece iyi çalışacaktır:

variable="line one\nline two"
echo "input data" | awk '{print var}' var="${variable}"
or
awk '{print var}' var="${variable}" file

Bu aynı zamanda çoklu değişkenlerle de çalışır awk '{print a,b,$0}' a="$var1" b="$var2" file

Değişkeni bu şekilde kullanmak BEGIN bloğunda çalışmaz:

echo "input data" | awk 'BEGIN {print var}' var="${variable}"

Here-string

Değişkenler, onları destekleyen kabuklardan (Bash dahil) bir [here-string][1] kullanılarak awka da eklenebilir:


awk '{print $0}' 
Yorumlar (6)

Kabuk değişkenlerindeki ters eğik çizgilerin nasıl işlenmesini istediğinize bağlı olarak bunlardan birini kullanın (avar bir awk değişkenidir, svar bir kabuk değişkenidir):

awk -v avar="$svar" '... avar ...' file
awk 'BEGIN{avar=ARGV[1];ARGV[1]=""}... avar ...' "$svar" file

Ayrıntılar ve diğer seçenekler için http://cfajohnson.com/shell/cus-faq-2.html#Q24 adresine bakın. Yukarıdaki ilk yöntem neredeyse her zaman en iyi seçenektir ve en belirgin semantiğe sahiptir.

Yorumlar (0)

Komut satırı seçeneği]1 -v ile bir değişken adı (v) ve ortam değişkeninin değerini (=) ("${v}") iletebilirsiniz:

% awk -vv="${v}" 'BEGIN { print v }'
123test

Ya da daha açık hale getirmek için (çok daha az v ile):

% environment_variable=123test
% awk -vawk_variable="${environment_variable}" 'BEGIN { print awk_variable }'
123test
Yorumlar (0)