本文翻譯自stackoverflow提問—— 「how do i use shell variables in an awk script?」,但更改了文章段落結構和部分表述。使用
-v
選項(p.s. 記得在選項和變數名之間加上空格)
variable=
"line one\nline two"
awk -v var=
"$variable"
'begin '
line one
line two
該方式應該是相容大多數版本的awk的,並且,變數也能在begin
塊中被訪問。
如果你想向awk中傳遞多個變數:
awk -v a=
"$var1" -v b=
"$var2"
'begin '
在呼叫awk
之前,先設定好變數,然後在awk
中通過環境變數environ
來獲取:
x=myvar
awk'begin'
myvar /bin/bash
將目標變數作為awk命令的引數傳入:
v=
"my data"
awk'begin '
"$v"
my data
如果希望不僅僅侷限在awk的begin塊中訪問目標變數,可以這樣:
v=
"my data"
echo
"test"
|awk
'begin '
"$v"
my data test
將待傳遞變數追加到awk命令的**塊之後,但這樣僅可在除begin
塊以外的地方,訪問目標變數:
variable=
"line one\nline two"
echo
"input data"
|awk
'' var=
"$"or
awk'' var=
"$"file
多個變數:
awk
'' a=
"$var1" b=
"$var2"
file
這種**塊之後增添變數的方式,也可以用於給不同檔案分別指定字段分隔符fs
:
awk
'some code' fs=
',' file1.txt fs=
';' file2.ext
**塊之後的變數,__無法__在begin
塊中使用!
echo
"input data"
|awk
'begin ' var=
"$"
目標變數也可以通過 here-string 的方式傳給awk,前提是shell支援here-string(bash支援):
awk
''<<<
"$variable"
test
這和下邊的寫法是一致的:
printf
'%s'
"$variable"
|awk
''
即:here-string 被當作檔案輸入處理了
here-string 不支援在begin
**塊中使用!
目標變數也可以直接在awk**中使用,但是這會有「**注入」的風險。如果別有用心的人,在變數中加入一些可執行的「壞」東西,而被awk當作code的一部分給執行了,那就糟了:
variable=
"line one\nline two"
awk'begin '
line one
line two
以下是乙個**注入的例子:
variable=
'line one\nline two" ; for (i=1;i<=1000;++i) print i"'
awk'begin '
line one
line two12
3..1000
許多命令都可以通過上述**注入的方式,誘導awk執行,甚至可以導致機器宕機。 Shell向Perl指令碼中傳遞變數的方法
方法一 in shell using export to output a variable,and in perl using special variable env to get shell s variables.i.e.shell box bin ksh export x foo perl...
Shell向Perl指令碼中傳遞變數的方法
方法一 in shell using export to output a variable,and in perl using special variable env to get shell s variables.i.e.shell box bin ksh export x foo perl...
Shell向Perl指令碼中傳遞變數的方法
方法一 in shell using exportto output a variable,andin perl using special variable env to get shell s variables.i.e.shell box bin ksh export x foo perl e...