文档章节

awk 变量、数值表达式以及赋值运算符如何使用

问题终结者
 问题终结者
发布于 2017/09/06 22:21
字数 1701
阅读 19
收藏 0
点赞 0
评论 0

我觉得 awk 系列 将会越来越好,在本系列的前七节我们讨论了在 Linux 中处理文件和筛选字符串所需要的一些 awk 命令基础。

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

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

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

1. Awk 变量

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

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

variable_name=value

上面的语法:

  • variable_name : 为定义的变量的名字
  • value : 为变量赋的值

再看下面的一些例子:

computer_name=”tecmint.com”
port_no=”22”
email=”admin@tecmint.com”
server=computer_name

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

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

你可以看看本系列的第 2 节中提到的字段编辑,我们讨论了 awk 怎样将输入的行分隔为若干字段并且使用标准字段访问操作符 $ 来访问拆分出来的不同字段。我们也可以像下面这样使用变量为字段赋值。

first_name=$2
second_name=$3

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

再举个例子,有一个名为 names.txt 的文件,这个文件包含了一个应用程序的用户列表,这个用户列表包含了用户的名和姓以及性别。可以使用 cat 命令 查看文件内容:

$ cat names.txt

awk 变量、数值表达式以及赋值运算符如何使用awk 变量、数值表达式以及赋值运算符如何使用

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

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

$ awk '/Aaron/{ first_name=$2 ; second_name=$3 ; print first_name, second_name ; }' names.txt

awk 变量、数值表达式以及赋值运算符如何使用awk 变量、数值表达式以及赋值运算符如何使用

使用 Awk 命令为变量赋值

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

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

$ uname -a
$ uname -a | awk '{hostname=$2 ; print hostname ; }'

awk 变量、数值表达式以及赋值运算符如何使用awk 变量、数值表达式以及赋值运算符如何使用

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

2. 数值表达式

在 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

awk 变量、数值表达式以及赋值运算符如何使用awk 变量、数值表达式以及赋值运算符如何使用

查看文件内容

如果想要计算出域名 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

awk 变量、数值表达式以及赋值运算符如何使用awk 变量、数值表达式以及赋值运算符如何使用

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

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

$ ./script.sh  ~/domains.txt

awk 变量、数值表达式以及赋值运算符如何使用awk 变量、数值表达式以及赋值运算符如何使用

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

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

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

因此,我们可以在 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

awk 变量、数值表达式以及赋值运算符如何使用awk 变量、数值表达式以及赋值运算符如何使用

修改了的 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

本文由 LCTT 原创编译,Linux中国 荣誉推出

原文来自:http://www.linuxprobe.com/awk-variable-expression.html

本文转载自:

共有 人打赏支持
问题终结者
粉丝 9
博文 578
码字总数 68489
作品 0
运维
《跟老男孩学Linux运维之shell编程实战》-第四章 变量的数值计算

本文讲解shell编程中变量的数值计算。 1.常见的算术运算符: 提示: 此处对于我自己来说++、--比较难理解,之前一看到脚本中有这些符号,就看不懂了,所以在此举例说明一下: [root@www ~]# ...

shayatou_1990 ⋅ 2017/04/21 ⋅ 0

Linux系统命令三剑客之 awk

命令名称:awk 作用: 对文本和数据进行处理 详细说明: awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理。 数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。...

民工哥 ⋅ 2017/11/13 ⋅ 0

文本三剑客之awk基础篇

1. awk基本介绍 awk是一种弱类型的编程语言,所以在使用变量时,其无需事先声明变量类型。 功能说明:gawk - pattern scanning and processing language awk是GNU项目,所以其实际的命令为g...

superloong ⋅ 01/14 ⋅ 0

linux中的awk用法入门详解(一)

简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的...

舞艺超炫 ⋅ 2017/02/17 ⋅ 0

Linux命令:文本处理工具awk详解

awk命令简介: awk是一个强大的文本分析工具,通常,awk是以文件的每一行,为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。 1.命令格式: awk 'pattern {action}'{fil...

wang6501081 ⋅ 2017/07/10 ⋅ 0

Linux shell篇---之二AWK

苏州IT之家群:46213669,技术交流,招聘就业,职业发展,欢迎苏州IT人士加入。 一、awk的格式 会对文件逐行读取进行处理。以行为操作对象。 awk [options] 'script' files...... awk[optio...

kuang_hp ⋅ 2015/09/28 ⋅ 0

8. Java 中的运算符 【连载 8】

从零开始学Java封面8.jpg 在前面的内容已经学会了如何定义变量和初始化变量。定义变量的目的就是为了操作数据。Java 语言中给我们提供了专门用来操作这些数据的代码符号,统称为“运算符”。...

密叔 ⋅ 2017/12/20 ⋅ 0

AWK 怎么读取标准输入(STDIN)

在第一个例子下面,我们使用 dir -l 命令的输出作为 awk 命令的输入,这样就可以打印出文件拥有者的用户名,所属组组名以及在当前路径下他/她拥有的文件。 # dir -l | awk '{print $3, $4,...

linuxprobe ⋅ 2016/08/05 ⋅ 0

Shell脚本学习指南摘录---1

1、数字与数值表达式 awk并没有提供字符串转数字的函数,不过awk的做法很简单:只要加个零到字符串里边,例如s = “123”,接着n = 0 + s,便将数字123赋给n了。 2、打印前几行的方式 head -...

断臂人 ⋅ 06/13 ⋅ 0

一名前端工程师的自学之路,Js篇(11-16更新)

css因为当时是看了各种书各种视频自己敲,没有做一些系统化的笔记。等这阵子公司项目忙完会抽出时间来整理一次的,毕竟css也是很深。我写这些东西也主要是分享一下自己当时的学习方法,现在还...

自律更自由 ⋅ 2017/11/16 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

NFS介绍 NFS服务端安装配置 NFS配置选项

NFS介绍 NFS是Network File System的缩写;这个文件系统是基于网路层面,通过网络层面实现数据同步 NFS最早由Sun公司开发,分2,3,4三个版本,2和3由Sun起草开发,4.0开始Netapp公司参与并主导...

lyy549745 ⋅ 8分钟前 ⋅ 0

Spring AOP 源码分析 - 筛选合适的通知器

1.简介 从本篇文章开始,我将会对 Spring AOP 部分的源码进行分析。本文是 Spring AOP 源码分析系列文章的第二篇,本文主要分析 Spring AOP 是如何为目标 bean 筛选出合适的通知器(Advisor...

java高级架构牛人 ⋅ 31分钟前 ⋅ 0

HTML-标签手册

标签 描述 <!--...--> 定义注释。 <!DOCTYPE> 定义文档类型。 <a> 定义锚。超链接 <abbr> 定义缩写。 <acronym> 定义只取首字母的缩写。 <address> 定义文档作者或拥有者的联系信息。 <apple......

ZHAO_JH ⋅ 33分钟前 ⋅ 0

SylixOS在t_main中使用硬浮点方法

问题描述 在某些使用场景中,应用程序不使用动态加载的方式执行,而是跟随BSP在 t_main 线程中启动,此时应用代码是跟随 BSP 进行编译的。由于 BSP 默认使用软浮点,所以会导致应用代码中的浮...

zhywxyy ⋅ 40分钟前 ⋅ 0

JsBridge原理分析

看了这个Github代码 https://github.com/lzyzsd/JsBridge,想起N年前比较火的Hybrid方案,想看看现在跨平台调用实现有什么新的实现方式。代码看下来之后发现确实有点独特之处,这里先把核心的...

Kingguary ⋅ 52分钟前 ⋅ 0

Intellij IDEA神器常用技巧五-真正常用快捷键(收藏级)

如果你觉得前面几篇博文太啰嗦,下面是博主多年使用Intellij IDEA真正常用快捷键,建议收藏!!! sout,System.out.println()快捷键 fori,for循环快捷键 psvm,main方法快捷键 Alt+Home,导...

Mkeeper ⋅ 52分钟前 ⋅ 0

Java 静态代码分析工具简要分析与使用

本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBugs,PMD,Jtest),最后从功能、特性等方面对它们进行分析和比较,...

Oo若离oO ⋅ 54分钟前 ⋅ 0

SpringBoot自动配置小记

spring-boot项目的特色就在于它的自动配置,自动配置就是开箱即用的本源。 不过支持一个子项目的自动配置,往往比较复杂,无论是sping自己的项目,还是第三方的,都是如此。刚接触会有点乱乱...

大_于 ⋅ 今天 ⋅ 0

React jsx 中写更优雅、直观的条件运算符

在这篇文字中我学到了很多知识,同时结合工作中的一些经验也在思考一些东西。比如条件运算符 Conditional Operator condition ? expr_if_true : expr_if_false 在jsx中书写条件语句我们经常都...

开源中国最帅没有之一 ⋅ 今天 ⋅ 0

vim编辑模式与命令模式

5.5 进入编辑模式 从编辑模式返回一般模式“Esc” 5.6 vim命令模式 命令 :“nohl”=no high light 无高亮,取消内容中高亮标记 "x":保存退出,和wq的区别是,当进入一个文件未进行编辑时,使...

弓正 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部