天天看点

awk 系列:怎样使用 awk 变量、数值表达式以及赋值运算符

在这一部分,我们将会进入 awk 更高级的部分,使用 awk 处理更复杂的文本和进行字符串过滤操作。因此,我们将会讲到 awk 的一些特性,诸如变量、数值表达式和赋值运算符。

学习 awk 变量,数值表达式和赋值运算符

你可能已经在很多编程语言中接触过它们,比如 shell,c,python 等;这些概念在理解上和这些语言没有什么不同,所以在这一小节中你不用担心很难理解,我们将会简短的提及常用的一些 awk 特性。

这一小节可能是 awk 命令里最容易理解的部分,所以放松点,我们开始吧。

<a target="_blank"></a>

在很多编程语言中,变量就是一个存储了值的占位符,当你在程序中新建一个变量的时候,程序一运行就会在内存中创建一些空间,你为变量赋的值会存储在这些内存空间上。

你可以像下面这样定义 shell 变量一样定义 awk 变量:

<code>variable_name=value</code>

上面的语法:

<code>variable_name</code>: 为定义的变量的名字

<code>value</code>: 为变量赋的值

再看下面的一些例子:

<code>computer_name=”tecmint.com”</code>

<code>port_no=”22”</code>

<code>email=”[email protected]”</code>

<code>server=computer_name</code>

观察上面的简单的例子,在定义第一个变量的时候,值 'tecmint.com' 被赋给了 'computer_name' 变量。

此外,值 22 也被赋给了 port_no 变量,把一个变量的值赋给另一个变量也是可以的,在最后的例子中我们把变量 computer_name 的值赋给了变量 server。

<code>first_name=$2</code>

<code>second_name=$3</code>

在上面的例子中,变量 first_name 的值设置为第二个字段,second_name 的值设置为第三个字段。

<code>$ cat names.txt</code>

awk 系列:怎样使用 awk 变量、数值表达式以及赋值运算符

使用 cat 命令查看列表文件内容

然后,我们也可以使用下面的 awk 命令把列表中第一个用户的第一个和第二个名字分别存储到变量 first_name 和 second_name 上:

<code>$ awk '/aaron/{ first_name=$2 ; second_name=$3 ; print first_name, second_name ; }' names.txt</code>

awk 系列:怎样使用 awk 变量、数值表达式以及赋值运算符

使用 awk 命令为变量赋值

再看一个例子,当你在终端运行 'uname -a' 时,它可以打印出所有的系统信息。

第二个字段包含了你的主机名,因此,我们可以像下面这样把它赋给一个叫做 hostname 的变量并且用 awk 打印出来。

<code>$ uname -a</code>

<code>$ uname -a | awk '{hostname=$2 ; print hostname ; }'</code>

awk 系列:怎样使用 awk 变量、数值表达式以及赋值运算符

使用 awk 把命令的输出赋给变量

在 awk 中,数值表达式使用下面的数值运算符组成:

<code>*</code> : 乘法运算符

<code>+</code> : 加法运算符

<code>/</code> : 除法运算符

<code>-</code> : 减法运算符

<code>%</code> : 取模运算符

<code>^</code> : 指数运算符

数值表达式的语法是:

<code>$ operand1 operator operand2</code>

上面的 operand1 和 operand2 可以是数值和变量,运算符可以是上面列出的任意一种。

下面是一些展示怎样使用数值表达式的例子:

<code>counter=0</code>

<code>num1=5</code>

<code>num2=10</code>

<code>num3=num2-num1</code>

<code>counter=counter+1</code>

要理解 awk 中数值表达式的用法,我们可以看看下面的例子,文件 domians.txt 里包括了所有属于 tecmint 的域名。

<code>news.tecmint.com</code>

<code>tecmint.com</code>

<code>linuxsay.com</code>

<code>windows.tecmint.com</code>

可以使用下面的命令查看文件的内容:

<code>$ cat domains.txt</code>

awk 系列:怎样使用 awk 变量、数值表达式以及赋值运算符

查看文件内容

如果想要计算出域名 tecmint.com 在文件中出现的次数,我们就可以通过写一个简单的脚本实现这个功能:

<code>#!/bin/bash</code>

<code>for file in $@; do</code>

<code>if [ -f $file ] ; then</code>

<code>#print out filename</code>

<code>echo "file is: $file"</code>

<code>#print a number incrementally for every line containing tecmint.com</code>

<code>awk '/^tecmint.com/ { counter=counter+1 ; printf "%s\n", counter ; }' $file</code>

<code>else</code>

<code>#print error info incase input is not a file</code>

<code>echo "$file is not a file, please specify a file." &gt;&amp;2 &amp;&amp; exit 1</code>

<code>fi</code>

<code>done</code>

<code>#terminate script with exit code 0 in case of successful execution</code>

<code>exit 0</code>

awk 系列:怎样使用 awk 变量、数值表达式以及赋值运算符

计算一个字符串或文本在文件中出现次数的 shell 脚本

写完脚本后保存并赋予执行权限,当我们使用文件运行脚本的时候,文件 domains.txt 作为脚本的输入,我们会得到下面的输出:

<code>$ ./script.sh ~/domains.txt</code>

awk 系列:怎样使用 awk 变量、数值表达式以及赋值运算符

计算字符串或文本出现次数的脚本

从脚本执行后的输出中,可以看到在文件 domains.txt 中包含域名 tecmint.com 的地方有 6 行,你可以自己计算进行验证。

我们要说的最后的 awk 特性是赋值操作符,下面列出的只是 awk 中的部分赋值运算符:

<code>*=</code> : 乘法赋值操作符

<code>+=</code> : 加法赋值操作符

<code>/=</code> : 除法赋值操作符

<code>-=</code> : 减法赋值操作符

<code>%=</code> : 取模赋值操作符

<code>^=</code> : 指数赋值操作符

下面是 awk 中最简单的一个赋值操作的语法:

<code>$ variable_name=variable_name operator operand</code>

例子:

<code>num=20</code>

<code>num=num-1</code>

你可以使用在 awk 中使用上面的赋值操作符使命令更简短,从先前的例子中,我们可以使用下面这种格式进行赋值操作:

<code>variable_name operator=operand</code>

<code>counter+=1</code>

<code>num-=1</code>

因此,我们可以在 shell 脚本中改变 awk 命令,使用上面提到的 += 操作符:

<code>awk '/^tecmint.com/ { counter+=1 ; printf "%s\n", counter ; }' $file</code>

awk 系列:怎样使用 awk 变量、数值表达式以及赋值运算符

修改了的 shell 脚本

这些概念和其他的编程语言没有任何不同,但是可能在 awk 中有一些意义上的区别。

原文发布时间为:2016-08-06

本文来自云栖社区合作伙伴“linux中国”