我以为 awk 系列 将会愈来愈好,在本系列的前七节咱们讨论了在 Linux 中处理文件和筛选字符串所须要的一些 awk 命令基础。html
在这一部分,咱们将会进入 awk 更高级的部分,使用 awk 处理更复杂的文本和进行字符串过滤操做。所以,咱们将会讲到 Awk 的一些特性,诸如变量、数值表达式和赋值运算符。linux
学习 Awk 变量,数值表达式和赋值运算符git
你可能已经在不少编程语言中接触过它们,好比 shell,C,Python 等;这些概念在理解上和这些语言没有什么不一样,因此在这一小节中你不用担忧很难理解,咱们将会简短的说起经常使用的一些 awk 特性。github
这一小节多是 awk 命令里最容易理解的部分,因此放松点,咱们开始吧。shell
在不少编程语言中,变量就是一个存储了值的占位符,当你在程序中新建一个变量的时候,程序一运行就会在内存中建立一些空间,你为变量赋的值会存储在这些内存空间上。express
你能够像下面这样定义 shell 变量同样定义 Awk 变量:编程
variable_name=value
上面的语法:vim
variable_name
: 为定义的变量的名字value
: 为变量赋的值再看下面的一些例子:windows
computer_name=”tecmint.com” port_no=”22” email=”admin@tecmint.com” server=computer_name
观察上面的简单的例子,在定义第一个变量的时候,值 'tecmint.com' 被赋给了 'computer_name' 变量。bash
此外,值 22 也被赋给了 port_no 变量,把一个变量的值赋给另外一个变量也是能够的,在最后的例子中咱们把变量 computer_name 的值赋给了变量 server。
你能够看看本系列的第 2 节中提到的字段编辑,咱们讨论了 awk 怎样将输入的行分隔为若干字段而且使用标准字段访问操做符 $
来访问拆分出来的不一样字段。咱们也能够像下面这样使用变量为字段赋值。
first_name=$2 second_name=$3
在上面的例子中,变量 first_name 的值设置为第二个字段,second_name 的值设置为第三个字段。
再举个例子,有一个名为 names.txt 的文件,这个文件包含了一个应用程序的用户列表,这个用户列表包含了用户的名和姓以及性别。可使用 cat 命令 查看文件内容:
$ cat names.txt
使用 cat 命令查看列表文件内容
而后,咱们也可使用下面的 awk 命令把列表中第一个用户的第一个和第二个名字分别存储到变量 first_name 和 second_name 上:
$ awk '/Aaron/{ first_name=$2 ; second_name=$3 ; print first_name, second_name ; }' names.txt
使用 Awk 命令为变量赋值
再看一个例子,当你在终端运行 'uname -a' 时,它能够打印出全部的系统信息。
第二个字段包含了你的主机名,所以,咱们能够像下面这样把它赋给一个叫作 hostname 的变量而且用 awk 打印出来。
$ uname -a $ uname -a | awk '{hostname=$2 ; print hostname ; }'
使用 Awk 把命令的输出赋给变量
在 Awk 中,数值表达式使用下面的数值运算符组成:
*
: 乘法运算符+
: 加法运算符/
: 除法运算符-
: 减法运算符%
: 取模运算符^
: 指数运算符数值表达式的语法是:
$ operand1 operator operand2
上面的 operand1 和 operand2 能够是数值和变量,运算符能够是上面列出的任意一种。
下面是一些展现怎样使用数值表达式的例子:
counter=0 num1=5 num2=10 num3=num2-num1 counter=counter+1
要理解 Awk 中数值表达式的用法,咱们能够看看下面的例子,文件 domians.txt 里包括了全部属于 Tecmint 的域名。
news.tecmint.com tecmint.com linuxsay.com windows.tecmint.com tecmint.com news.tecmint.com tecmint.com linuxsay.com tecmint.com news.tecmint.com tecmint.com linuxsay.com windows.tecmint.com tecmint.com
可使用下面的命令查看文件的内容:
$ cat domains.txt
查看文件内容
若是想要计算出域名 tecmint.com 在文件中出现的次数,咱们就能够经过写一个简单的脚本实现这个功能:
#!/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 tecmint.com awk '/^tecmint.com/ { counter=counter+1 ; printf "%s\n", counter ; }' $file else #print error info incase input is not a file echo "$file is not a file, please specify a file." >&2 && exit 1 fi done #terminate script with exit code 0 in case of successful execution exit 0
计算一个字符串或文本在文件中出现次数的 shell 脚本
写完脚本后保存并赋予执行权限,当咱们使用文件运行脚本的时候,文件 domains.txt 做为脚本的输入,咱们会获得下面的输出:
$ ./script.sh ~/domains.txt
计算字符串或文本出现次数的脚本
从脚本执行后的输出中,能够看到在文件 domains.txt 中包含域名 tecmint.com 的地方有 6 行,你能够本身计算进行验证。
咱们要说的最后的 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
所以,咱们能够在 shell 脚本中改变 awk 命令,使用上面提到的 += 操做符:
#!/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 tecmint.com awk '/^tecmint.com/ { counter+=1 ; printf "%s\n", counter ; }' $file else #print error info incase input is not a file echo "$file is not a file, please specify a file." >&2 && exit 1 fi done #terminate script with exit code 0 in case of successful execution exit 0
修改了的 shell 脚本
在 awk 系列 的这一部分,咱们讨论了一些有用的 awk 特性,有变量,使用数值表达式和赋值运算符,还有一些使用它们的实例。
这些概念和其余的编程语言没有任何不一样,可是可能在 awk 中有一些意义上的区别。
在本系列的第 9 节,咱们会学习更多的 awk 特性,好比特殊格式: BEGIN 和 END。请继续关注。
via: http://www.tecmint.com/learn-awk-variables-numeric-expressions-and-assignment-operators/
做者:Aaron Kili
译者:vim-kakali
校对:wxy