shell 向 awk 傳遞變數引數

2021-10-11 07:42:34 字數 2362 閱讀 2851

本文翻譯自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...