awk
是Linux中一款非常好用的程序,可以逐行处理文件,并提供了强大的语法和函数,和grep
、sed
一起被称为"Linux三剑客"。
在使用awk
处理文件时,有时会用到shell
中定义的变量,由于在shell
中变量的调用方式是通过$
符号进行的,而在awk
中$
符号有特殊的含义,它可以表示待处理文件的某一列,也可以表示所有列(即$0
),因此不能在awk
中通过$
符号调用shell
变量。
下面来介绍两种在awk
中调用shell
变量的方式。
方式1:通过双引号加单引号的方式
语法规则:在变量两边加入双引号和单引号,即 "'$var'"
的形式
示例命令如下:
bash
var1="shell"
var2="python"
awk 'BEGIN {print "'$var1'"; print "'$var2'"}'
# 输出结果
# shell
# python
这里用到了awk
的BEGIN
语句(即BEGIN { }
),它是awk
程序在没有读取任何数据之前最先执行的语句。
此外这种调用shell
变量的方式也可以用在awk后面接文件输入时,如下所示:
bash
echo -e "hello\nhi" > a.txt
var1="shell"
var2="python"
awk '{print $0", ""'$var1'"" and ""'$var2'"}' a.txt # 这里$0表示文件a.txt的整行
# $0和后面 "'$var1'" 之间的 ", " 是字符串连接方式,它允许将多个变量连接成一个字符串
# 输出结果
# hello, shell and python
# hi, shell and python
不难发现,这种调用方式会在awk
命令中引入很多的双引号和单引号,当命令较多时就会产生混淆,可读性非常差,容易出现问题。下面介绍一种可读性更好的调用shell
变量的方式。
方式2:通过-v参数将shell变量转为awk变量
awk
非常强大,它允许用户自定义变量,如下面的代码:
bash
awk 'BEGIN {var="hello"; print var}'
# 输出结果
# hello
上述命令变量var
进行了赋值,然后打印了变量var
的值。
此外awk
提供了一个-v
参数,可以来对awk
中的变量进行赋值,示例代码如下:
bash
awk -v var="hello" 'BEGIN {print var}'
# 输出结果
# hello
在上述命令中,通过-v
参数在awk
中给变量var
赋值为了"hello"字符串,然后就可以在awk
中直接调用var
变量,最终打印结果为"hello"。
因此可以结合-v
参数来将shell
变量赋值为awk
变量,然后在awk
中就可以直接使用shell
变量的值了,示例代码如下:
bash
var1="shell"
var2="python"
awk -v a="$var1" -v b="$var2" 'BEGIN{print "a is "a, "\nb is "b}'
# 输出结果
# a is shell
# b is python
需要注意的是,-v
参数必须在BEGIN
语句的前面才能发挥作用!
上述用法也可以用在awk
处理文件时,如下:
bash
awk -v a="$var1" -v b="$var2" '{print "a is "a, "\nb is "b}' a.txt
总结
本文介绍了两种在awk
中使用shell
变量的方式:
方式1:awk 'BEGIN {print "'$var1'"; print "'$var2'"}'
方式2:awk -v a="$var1" -v b="$var2" 'BEGIN{print a; print b}'
本文参考链接: