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)
-v
Seçeneği kullanın : (PS -v
daha 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ı awk
ve değişken BEGIN
blokta 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 , \t
gerçek olur . Kullanarak çözülebilir veya üzerinden erişilebilirtab
\t
ENVIRON[]
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 awk
koddan sonra alırız . Bu, BEGIN
bloktaki 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
FS
her 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, ARGV
verileri 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
awk
Kod 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, awk
kodun 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.
awk
Değ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
awk
Bu ş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 .