Kabuk değişkenlerini içine alma awk
birkaç şekilde yapılabilir. Bazıları diğerlerinden daha iyidir. Bu onların çoğunu kapsamalıdır. Eğer bir yorumunuz varsa, lütfen aşağıya bırakın. v1.5
Kullanma -v (en iyi yolu, en taşınabilir)
-vSeçeneği kullanın : (PS -vdaha sonra bir boşluk kullanırsa veya daha az taşınabilir olacaktır. Örneğin, awk -v var=değil awk -vvar=)
variable="line one\nline two"
awk -v var="$variable" 'BEGIN {print var}'
line one
line two
Bu çoğu ile uyumlu olmalı awkve değişken BEGINblokta da kullanılabilir :
Birden çok değişkeniniz varsa:
awk -v a="$var1" -v b="$var2" 'BEGIN {print a,b}'
Uyarı . Ed Morton'un yazdığı gibi, kaçış dizileri yorumlanacak, böylece aradığınız şey bu değil , \tgerçek olur . Kullanarak çözülebilir veya üzerinden erişilebilirtab\tENVIRON[]ARGV[]
PS Eğer ayırıcı olarak üç dikey çubuk isterseniz |||, kaçamaz, bu yüzden kullanın-F"[|][|][|]"
Bir program / işlev hanından veri alma örneği awk(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 değişkeni awkkoddan sonra alırız . Bu, BEGINbloktaki değişkene ihtiyacınız olmadığı sürece iyi çalışır :
variable="line one\nline two"
echo "input data" | awk '{print var}' var="${variable}"
or
awk '{print var}' var="${variable}" file
- Birden çok değişken ekleme:
awk '{print a,b,$0}' a="$var1" b="$var2" file
- Bu şekilde
FSher dosya için farklı Alan Ayırıcı da ayarlayabiliriz .
awk 'some code' FS=',' file1.txt FS=';' file2.ext
- Kod bloğundan sonraki değişken blok için çalışmaz
BEGIN:
echo "input data" | awk 'BEGIN {print var}' var="${variable}"
İşte-string
Değişken, onları destekleyen kabuklardan (Bash dahil) burada bir dizeninawk kullanılması için de eklenebilir :
awk '{print $0}' <<< "$variable"
test
Bu aynı:
printf '%s' "$variable" | awk '{print $0}'
PS, bu değişkeni bir dosya girişi olarak ele alır.
ENVIRON giriş
TrueY yazarken, Ortam DeğişkenleriniENVIRON yazdırmak için kullanabilirsiniz . AWK'yi çalıştırmadan önce bir değişken ayarlamak, onu şu şekilde yazdırabilirsiniz:
X=MyVar
awk 'BEGIN{print ENVIRON["X"],ENVIRON["SHELL"]}'
MyVar /bin/bash
ARGV giriş
Steven Penny'in yazdığı gibi, ARGVverileri awk'ye almak için kullanabilirsiniz :
v="my data"
awk 'BEGIN {print ARGV[1]}' "$v"
my data
Verileri kodun içine almak için sadece BEGIN değil:
v="my data"
echo "test" | awk 'BEGIN{var=ARGV[1];ARGV[1]=""} {print var, $0}' "$v"
my data test
Kod içindeki değişken: DİKKATLİ KULLANIN
awkKod içinde bir değişken kullanabilirsiniz , ancak dağınık ve okunması zor ve belirtildiği gibi Charles Duffy, bu sürüm kod enjeksiyonunun bir kurbanı olabilir. Birisi değişkene kötü şeyler eklerse, awkkodun bir parçası olarak yürütülür .
Bu, kod içindeki değişkeni ayıklayarak çalışır, böylece bir parçası haline gelir.
awkDeğişkenlerin kullanımı ile dinamik olarak değişen bir değişiklik yapmak istiyorsanız, bunu bu şekilde yapabilirsiniz, ancak normal değişkenler için KULLANMAYIN.
variable="line one\nline two"
awk 'BEGIN {print "'"$variable"'"}'
line one
line two
Kod enjeksiyonuna bir örnek:
variable='line one\nline two" ; for (i=1;i<=1000;++i) print i"'
awk 'BEGIN {print "'"$variable"'"}'
line one
line two
1
2
3
.
.
1000
awkBu şekilde çok sayıda komut ekleyebilirsiniz . Hatta geçerli olmayan komutlarla çökmesini sağlayın.
Fazladan bilgi:
Çift tırnak kullanımı
Değişken değerini iki katına çıkarmak her zaman iyidir. "$variable"
Değilse, uzun bir satır olarak birden çok satır eklenir.
Misal:
var="Line one
This is line two"
echo $var
Line one This is line two
echo "$var"
Line one
This is line two
Çift tırnak işareti olmadan alabileceğiniz diğer hatalar:
variable="line one\nline two"
awk -v var=$variable 'BEGIN {print var}'
awk: cmd. line:1: one\nline
awk: cmd. line:1: ^ backslash not last character on line
awk: cmd. line:1: one\nline
awk: cmd. line:1: ^ syntax error
Ve tek tırnakla, değişkenin değerini genişletmez:
awk -v var='$variable' 'BEGIN {print var}'
$variable
AWK ve değişkenler hakkında daha fazla bilgi
Bu SSS'yi okuyun .