概述

awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。

命令的基本格式如下:

[root@localhost ~]# awk '条件1 {执行语句 1} 条件 2 {执行语句 2} …' 文件名

在awk编程中,因为命令语句非常长,所以在输入格式时需要注意以下内容:

  • 多个条件{动作}可以用空格分隔,也可以用回车分隔。
  • 在一个动作中,如果需要执行多条命令,则需要用分隔,或用回车分隔。
  • 在awk中,变量的赋值与调用都不需要加入"$"符号。

条件(Pattern):
一般使用关系表达式作为条件。这些关系表达式非常多 。

条件类型 条 件 说 明
awk保留字 BEGIN 在 awk 程序一开始,尚未读取任何数据之前执行。BEGIN 后的动作只在程序开始时执行一次
awk保留字 END 在 awk 程序处理完所有数据,即将结束时执行?END 后的动作只在程序结束时执行一次
关系运算符 > 大于
< 小于
>= 大于等于
<= 小于等于
== 等于。用于判断两个值是否相等。如果是给变童赋值,则使用"=”
!= 不等于
A~B 判断字符串 A 中是否包含能匹配 B 表达式的子字符串
A!~B 判断字符串 A 中是否不包含能匹配 B 表达式的子字符串
正则表达式 /正则/ 如果在“//”中可以写入字符,则也可以支持正则表达式

awk常见的内置变量 

awk 内置变量

说明
$0 当前记录(作为单个变量)
$1~$n 当前记录的第n个字段,字段间由FS分隔
FS 输入字段分隔符, 默认为空白字符
OFS 输出字段分隔符, 默认为空白字符
RS 输入记录分隔符(输入换行符), 指定输入时的换行符
ORS 输出记录分隔符(输出换行符),输出时用指定符号代替换行符
NF 当前行的字段的个数(即当前行被分割成了几列),字段数量
NR 当前处理的文本行的行号 
FNR 各文件分别计数的行号
FILENAME 当前文件名
ARGC 命令行参数的个数
ARGV 数组,保存的是命令行所给定的各参数

awk命令示例

awk命令基本示例

列出 student.txt 文件的第二个字段和第六个字段,"$2"和"$6"分别代表第二个字段和第六个字段。

[root@localhost ~]# awk '{printf $2 "\t" $6 "\n"}' student.txt
#输出第二列和第六列的内容
Name Average
Liming 87.66
Sc 85.66
Gao 91.66

对于 awk 命令来说,只要分隔开,不管是空格还是制表符,都可以识别。 命令如下:

[root@localhost ~]#df -h | awk '{print $1 "\t" $3}'
文件系统 已用
/dev/sda3 1.8G
tmpfs 0
/dev/sda1 26M
/dev/sr0 3.5G

在这两个例子中,如果使用 printf 动作,就必须在最后加入"\n",因为 printf 只能识别标准输出格式;如果我们不使用"\n",它就不会换行。而 print 动作则会在每次输出后自动换行,所以不用在最后加入"\n"。

awk使用条件的示例

BEGIN 是 awk 的保留字,是一种特殊的条件类型。BEGIN 的执行时机是"在 awk 程序一开始,尚未读取任何数据之前"。一旦 BEGIN 后的动作执行一次,当 awk 开始从文件中读入数据时,BEGIN 的条件就不再成立,所以 BEGIN 定义的动作只能被执行一次。例如:

[root@localhost ~]# awk 'BEGIN{printf "This is a transcript\n"}
{printf $2 "\t" $6 "\n"}' student.txt
This is a transcript
Name Average
Liming 87.66
Sc 85.66
Gao 91.66

awk命令只要检测不到完整的单引号就不会执行,所以这条命令的换行不用加入"\",就是一行命令。首先使用BEGIN条件在读入文件数据前打印"这是一张成绩单"(只会执行一次),再打印文件的第二个字段和第六个字段。

END 是在 awk 程序处理完所有数据,即将结束时执行的。END 后的动作只在程序结束时执行一次。例如:

[root@localhost ~]# awk 'END{printf "The End \n"}
{printf $2 "\t" $6 "\n"}' student.txt
Name Average
Liming 87.66
Sc 85.66
Gao 91.66
The End

查看平均成绩大于等于 87 分的学员,就可以这样输入命令:

[root@localhost ~]# cat student.txt | grep -v Name |awk'$6 >= 87 {printf $2'\n"}'
Liming
Gao

使用cat输出文件内容,用grep取反包含"Name"的行
判断第六个字段(平均成绩)大于等于87分的行,如果判断式成立,则打印第2列学员名

查看Sc用户的平均成绩

[root@localhost ~]# awk'$2 -/Sc/ {printf $6 "\n"}' student.txt
85.66

如果第二个字段中包含"Sc"字符,则打印第六个字段

在 awk 中,只有使用"//"包含的字符串,awk 命令才会査找。也就是说,字符串必须用"//"包含,awk 命令才能正确识别。

査看系统分区的使用情况而不想査看光盘和临时分区的使用情况时,可以只查询包含"sda数字"的行,并打印第一个字段和第五个字段

[root@localhost ~]# df -h | awk '/sda[0-9]/ {printf $1 '\t\ $5 "\n"}'
/dev/sda3 10%
/dev/sda1 15%

awk使用内置变量的示例

在 awk 中允许定义变量,允许使用运算符,允许使用流程控制语句和定义函数。这样就使得 awk 编程成了一门完整的程序语言,当然难度也比普通的命令要大得多。

创建文件

[root@localhost ~]# cat student.txt
ID Name PHP Linux MySQL Average
1 Liming 82 95 86 87.66
2 Sc 74 96 87 85.66
3 Gao 99 83 93 91.66

在 awk 中定义变量与调用变量的值。假设统计 PHP 成绩的总分:

[root@localhost ~]# awk'NR==2{php1 =$3}
NR==3{php2=$3}
NR==4{php3= $3;totle=php1+php2+php3;print "totle php is" totle}' student.txt
totle php is 255

说明:

  • "NR==2{php1=$3}"(条件是NR==2,动作是php=$3) 是指如果输入数据是第二行(第一行是标题行),就把第二行的第三个字段的值赋予变量"php1"。
  • "NR==3{php2=$3}"是指如果输入数据是第三行,就把第三行的第三个字段的值赋予变量"php2"。NR==4{php3=$3;totle=php1+php2+php3;print"totle php is"totle}"("NR==4"是条件,后面{}中的都是动作)是指如果输入数是第四行,就把第四行的第三个字段的值赋予变量"php3";然后定义变量 totle 的值是"php1+php2+php3";最后输出"totle php is"关键字,后面加变量 totle 的值。

查看Linux 成绩大于 90 分的用户,命令如下:

[root@localhost ~]# awk' NR>=2 {test=$4}
test>90 {printf $2" \n"}' student.txt
Liming
Sc

先判断行号,如果大于2,就把第四个字段的值赋予变量test

再判断成绩,如果test的值大于90分,就打印好男人

Linux Shell编程 awk命令的更多相关文章

  1. Linux Shell编程 sed命令

    概述 sed 是一种几乎可以应用在所有 UNIX 平台(包括 Linux)上的轻量级流编辑器,体积小.所以,它可以对从如管道这样的标准输入中接收的数据进行编辑. sed 主要是用来将数据进行选取.替换 ...

  2. Linux Shell编程 test命令

    概述 test 命令是Shell 脚本中用来进行条件判断的. test命令示例 按照文件类型进行判断 测试选项 作 用 -b 文件 判断该文件是否存在,并且是否为块设备文件(是块设备文件为真) -c ...

  3. Linux Shell编程中的几个特殊符号命令 & 、&& 、 ||

    https://blog.csdn.net/hack8/article/details/39672145 Linux Shell编程中的几个特殊符号命令 & .&& . || ...

  4. linux —— shell 编程(文本处理)

    导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 基本文本处理 流编辑器sed aw ...

  5. linux shell编程总结

    linux shell编程总结 本周学习了unix/linux shell编程,参考的是<LINUX与UNIX Shell 编程指南>,David Tansley著:徐焱,张春萌等译,由机 ...

  6. linux shell编程,先等10秒再判断是否有进程存在,存在就再等10秒再杀了进程才运行

    linux shell编程,先等10秒再判断是否有进程存在,存在就再等10秒再杀了进程才运行 crontab每分钟执行一次,但5秒以上才有更新数据,有时候一分钟可能跑不完上一个进程,需要先等10秒再判 ...

  7. linux —— shell 编程(编程语法)

    导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 再识变量 函数 条件语句 循环语句 ...

  8. Linux Shell编程参考大全

    本文记录Linux Shell编程中常用基本知识,方便快速入门以及查询使用. 本文主要分为以下几个部分: 一.Shell中的变量 任何编程语言中,有关变量的定义,作用范围,赋值等都是最最基础的知识. ...

  9. linux shell 编程参考

    #!/bin/bash my_fun() { echo "$#" } echo 'the number of parameter in "$@" is '$(m ...

随机推荐

  1. windows下mysql表名不自动转换小写配置

    mysql5.6版本配置文件有两个 1.默认的配置在program files/MySQL/MySQL Server 5.6/my-default.ini 2.一个在programData/MySQL ...

  2. 下载 Microsoft SQL Server JDBC 驱动程序

    JDBC 驱动程序中使用 Maven 中心 JDBC 驱动程序可以通过将其添加为依赖项在 POM.xml 文件中使用以下代码添加到 Maven 项目: XML复制 <dependency> ...

  3. dm8148 开发之---4路解码器tvp5158

    通过采用自动对比度控制与视频噪声过滤技术的全新 TVP515x 器件,采集4通道视频,可带来优异图像质量并实现市场领先的视频解码性能德州仪器 (TI) 宣布推出可实现优异图像质量的新型 TVP5158 ...

  4. linux tableau server 连接 presto

    记录一下这个弄个好久的难题 linux tableau server 版本  tableau-server-2018-2-0.x86_64.rpm 安装过程 我参照了这儿仁兄   http://ju. ...

  5. 新MBP使用git命令时启用xcode的终端log

    Last login: Mon Oct 22 12:41:33 on consoleuser:~ me$ git Agreeing to the Xcode/iOS license requires ...

  6. C# 持续序列化对象追加到文件的方法

    最近有个需求,将内存和帧数数据序列化到二进制文件.为了节省内存,采用了100个对象的数组,每次存满就序列化到文件,然后归零继续存,以追加的性式继续序列化到原有文件. 这样相当于多个数组对象存在了同一个 ...

  7. css 使图片紧贴底部显示

    img{ display: table-cell; vertical-align: bottom; }

  8. 表变量、临时表(with as ,create table)

    1.declare @t table(CountryRegionCode nvarchar(3))insert into @t(CountryRegionCode)  (select CountryR ...

  9. gridgroup行内编辑删除

    Ext.define('Task', { extend: 'Ext.data.Model', idProperty: 'taskId', fields: [ { name: 'projectId', ...

  10. 拍照权限,GPS权限的控制

    最近项目中会遇到一些手机用户权限的问题,从网上百度了一下,发现有一些方法不能解决判断用户权限的是否开关,下面我就介绍两种权限的判断 1 拍照的权限控制 public static boolean is ...