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ı.
258
3
Using
-v
(En iyi yol, en taşınabilir)v
seç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ğil
awk -vvar=`)Bu, çoğu
awk
ile uyumlu olmalıdır ve değişkenBEGIN
bloğunda da kullanılabilir:Birden fazla değişkeniniz varsa:
Uyarı. Ed Morton'un yazdığı gibi, kaçış dizileri yorumlanacaktır, böylece
\t
gerçek birtab
olur ve aradığınız şey buysa\t
olmaz. ENVIRON[]kullanılarak çözülebilir veya
ARGV[]` ile erişilebilirPS Üç dikey çubuğu ayırıcı olarak
|||
seviyorsanız,-F"[|][|][|]"
kullanın.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: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:Here-string
Değişkenler, onları destekleyen kabuklardan (Bash dahil) bir [here-string][1] kullanılarak
awk
a da eklenebilir: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):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.
Komut satırı seçeneği]1
-v
ile bir değişken adı (v
) ve ortam değişkeninin değerini (=
) ("${v}"
) iletebilirsiniz:Ya da daha açık hale getirmek için (çok daha az
v
ile):