从这部分开始,我们应该研究Awk的高级部分,处理更复杂文本或者字符串过滤操作。因而,我们讨论Awk特性,诸如变量、数值表达式和赋值操作符。
这些概念不完全不同于之前你在很多编程语言中可能已经遇到的概念,诸如shell,C,Python和很多其它,因此不需要太担心这个话题,我们只是修改了使用这些提及特性的共同观点。
这可能是要理解的最简单Awk命令之一,因此继续讲解。
1、Awk变量
在任何编程语言中,一个变量是一个存储一个值的占位符,当你在一个程序文件中创建一个变量时,随着这个文件被执行,在内存中创建某个位置,它将存储你为这个变量存储的值。
你可以用你定义shell变量的相同方法定义Awk变量,如下:
variable_name=value
在以上语法中:
- variable_name:你赋给一个变量的名称
- value:在这个变量中存储的值
看一下以下的示例:
computer_name=”blctrl.ac”
port_no=”22”
email=”admin@blctrl.ac”
server=”computer_name”
看一下以上简单的示例,在第一个变量定义中,值blctrl.ac被分配给了变量computer_name。22被分配给了变量port_no,如在最后一个示例中我们分配了computer_name的值给变量server,分配一个变量的值给另一个变量也是可能的。
如果你立即回想Awk系列的第二部分,我们包含了字段编辑,我们讨论了Awk如何划分输入行成字段并且使用字段访问操作符$读取已经被解析的不同字段。我们也可以使用变量存储字段的值,如:
first_name=$2
second_name=$3
在以上示例中,first_name的值被设置成第二个字段,而second_name被设置成第三个字段。
作为一个演示,考虑一个名为names.txt的文件,它包含了一张用户列表,列表包含姓名以及性别。使用cat命令,我们可以查看这个文件的内容:
[root@telecom exer]# cat names.txt
1. Tom A M
2. Jerry B M
3. Kate C F
4. Lily D F
5. King Green F
6. Lucy Huber M
接着,我们通过运行以下Awk命令使用变量first_name和second_name存储列表上第一个用户的姓和名:
[root@telecom exer]# awk '/Tom/{ first_name=$2;second_name=$3;print first_name,second_name}' names.txt
Tom A
让我们看一下另一种情况,当你在你的终端上发出uname -a命令时,它打印出所有你系统信息。第二个字段包含你的hostname,因而我们能够使用Awk在称为hostname的变量中存储这个主机名并且打印它。
[root@telecom exer]# uname -a
Linux telecom 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
[root@telecom exer]# uname -a | awk '{hostname=$2;print hostname}'
telecom
2 数值表达式
在Awk中,使用以下数值操作符构建数值表达式:
- *:乘号
- +:加号
- /:除号
- -:减号
- %:取模操作符
- ^:指数操作符
数值表达式的语法是:
$ operand1 operator operand2
在以上格式中,operand1和operand2可以是数值或者变量名,并且操作符是以上任意操作符。
以下是用于演示如何构建数值表达式的一些示例:
counter=0
num1=5
num2=10
num3=num2-num1
counter=counter+1
要理解在Awk中数值表达式的使用,我们应该考虑以下示例:
[root@telecom exer]# cat dnsnames.txt
news.blctrl.ac
blctrl.ac
linuxsay.com
windows.blctrl.ac
blctrl.ac
news.blctrl.ac
blctrl.ac
linuxsay.com
blctrl.ac
news.blctrl.ac
blctrl.ac
linuxsay.com
windows.blctrl.ac
blctrl.ac
如果我们想要数出blctrl.ac在这个文件中出现的次数,我们可以写一个简单脚本做这件事:
[root@telecom exer]# cat count.sh
#!/bin/bash
for file in $@;do
if [ -f $file ];then
# print out filename
echo "File is : $file"
# print a number incrementally for every line containing blctrl.ac
awk '/^blctrl.ac/{counter=counter+1;printf "%s\n",counter;}' $file
else
# print error info in case input is not a file
echo "$file is not a file, please specify a file." >&2 && exit 1
fi
done
exit 0
在创建这个脚本后,保存它并使之可执行,当我们用这个文件dnsnames.txt运行它时,我们获得以下输出:
[root@telecom exer]# ./count.sh dnsnames.txt
File is : dnsnames.txt
1
2
3
4
5
6
从这个脚本的输出,在文件dnsnames.txt中有6行包含以blctrl.ac起始,证实了你可以手动对它们计数。
3、赋值操作符
Awk特性包含了赋值操作符,在Awk中有若干赋值操作符,这些包含以下:
- *=:乘赋值操作符。
- +=:加赋值操作符
- /=:除赋值操作符
- -=:减赋值操作符
- %=:取模赋值操作符
- ^=:指数赋值操作符
在Awk中赋值操作的最简单语法是:
$ variable_name=variable_name operator operand
示例:
counter=0
counter=counter+1
num=20
num=num-1
你可以在Awk中使用以上赋值操作符缩短赋值操作,考虑先前的示例,我们应该用以下格式执行赋值:
variable_name operator=operand
counter=0
counter+=1
num=20
num-=1