我发现了一些将外部shell变量传递给awk
脚本的方法,但我对'
和"
感到困惑。
首先,我尝试使用shell脚本:
$ v=123test
$ echo $v
123test
$ echo "$v"
123test
然后尝试awk:
$ awk 'BEGIN{print "'$v'"}'
$ 123test
$ awk 'BEGIN{print '"$v"'}'
$ 123
为什么会有区别?
最后我试了一下:
$ 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
我对这个很困惑。
7条答案
按热度按时间x0fgdtte1#
将shell变量导入
awk
有几种方法。有些方法比其他方法更好。这应该涵盖了大多数方法。如果你有意见,请在下面留言。 版本1.5使用
-v
(最佳方式,最便携)使用
-v
选项:(P.S.在-v
之后使用空格,否则它将不太便于携带。例如,awk -v var=
而不是awk -vvar=
)这应该与大多数
awk
兼容,并且BEGIN
块中也提供了该变量:如果有多个变量:
\t
将变为真正的tab
,而不是您要搜索的\t
。可以通过使用ENVIRON[]
或通过ARGV[]
访问它来解决|?(
等,它们必须进行双转义。示例3竖线|||
变为-F'\\|\\|\\|'
。您也可以使用-F"[|][|][|]"
。从程序/函数inn获取数据到
awk
的示例(此处使用日期)将shell变量的内容作为regexp进行测试的示例:
代码块后的变量
这里我们得到了
awk
代码后面的变量,只要你不需要BEGIN
代码块中的变量,这个方法就可以很好地工作:x1米20英寸1x
FS
。awk 'some code' FS=',' file1.txt FS=';' file2.ext
BEGIN
块:echo "input data" | awk 'BEGIN {print var}' var="${variable}"
这里串
变量也可以使用here-string从支持它们的shell(包括Bash)添加到
awk
:这与以下内容相同:
P.S.这将变量视为文件输入。
输入
正如TrueY所写的,可以使用
ENVIRON
来打印环境变量。在运行AWK之前设置一个变量,可以如下所示打印出来:输入
正如Steven Penny所写的,可以使用
ARGV
将数据放入awk:要使数据进入代码本身,而不仅仅是BEGIN:
代码中的变量:小心使用
你可以在
awk
代码中使用一个变量,但是它很混乱,很难阅读,正如Charles Duffy
指出的,这个版本也可能是代码注入的受害者。如果有人在变量中添加了不好的东西,它将作为awk
代码的一部分执行。这是通过提取代码中的变量来实现的,因此变量成为代码的一部分。
如果你想创建一个
awk
,它可以使用变量动态地改变,你可以这样做,但是不要把它用于普通变量。下面是代码注入的一个示例:
你可以用这种方法给
awk
添加很多命令,甚至用无效的命令使它崩溃。不过,这种方法的一个有效用法是,当你想把一个符号传递给awk,以便应用于某个输入时,比如一个简单的计算器:
使用一个填充了shell变量值的awk变量是无法做到这一点的,您需要在awk解释shell变量之前将其扩展为awk脚本文本的一部分。
额外信息:
使用双引号
变量
"$variable"
最好用双引号引起来否则,多行将作为一个长单行添加。
示例:
不使用双引号可能出现的其他错误:
如果使用单引号,则不会展开变量的值:
有关AWK和变量的详细信息
阅读此常见问题。
wtlkbnrh2#
似乎根本没有提到好的老的
ENVIRON
awk内置散列。6ovsh4lw3#
您可以在命令行选项
-v
中传递变量名(v
)和环境变量("${v}"
)的值(=
):或者说得更清楚一些(
v
要少得多):hc8w905p4#
您可以使用ARGV:
请注意,如果要继续进入身体,则需要调整ARGC:
zqry0prt5#
我只是将@Jotne的答案改为“for循环”。
jei2mxaa6#
我不得不在日志文件的行首插入日期,它是这样做的:
可以将其重定向到另一个文件进行保存
5m1hhzi47#
Pro头端
创建一个函数来处理这个问题会很方便,这样你就不必每次都输入所有的内容。使用所选的解决方案,我们得到...
把它当作...