linux shell编程指南第九章------AWK 介绍1_awk匹配域名-程序员宅基地

技术标签: 脚本  linux脚本  shell  linux  正则表达式  linux shell  

为使一域号匹配正则表达式,使用符号‘~’后紧跟正则表达式,也可以用i f语句。a w k
中i f后面的条件用()括起来。

观察文件g r a d e . t x t,如果只要打印b r o w n腰带级别可知其所在域为f i e l d - 4,这样可以写出
表达式{if($4~/brown/) print }意即如果f i e l d - 4包含b r o w n,打印它。如果条件满足,则打印匹

配记录行。可以编写下面脚本,因为这是一个动作,必须用花括号{ }括起来。

[root@localhost huangcd]# awk '{if($4~/Brown/) print $0}' grade.txt
J.Troll     07/99     4842   Brown-3  12   26   26
L.Tansley   05/99     4712   Brown-2  12   30   28

[root@localhost huangcd]# awk '$0~/Brown/' grade.txt 
J.Troll     07/99     4842   Brown-3  12   26   26
L.Tansley   05/99     4712   Brown-2  12   30   28

~表示匹配正则表达式的意思。正则表达式在两个//中间。

假定要使字符串精确匹配,比如说查看学生序号4 8,文件中有许多学生序号包含4 8,如
果在f i e l d - 3中查询序号4 8,a w k将返回所有序号带4 8的记录:

[root@localhost huangcd]# awk '{if($3~/48/) print $0}'  grade.txt 
M.Tansley   05/99     48311  Green    8    40   44
J.Lulu      06/99     48317  green    9    24   26
P.Bunny     02/99     48     Yellow   12   35   28
J.Troll     07/99     4842   Brown-3  12   26   26

为精确匹配4 8,使用等号= =,并用单引号括起条件。例如$ 3 = =“4 8”,这样确保只有4 8
序号得以匹配,其余则不行。

[root@localhost huangcd]# awk '$3=="48" {print $0}' grade.txt 
P.Bunny     02/99     48     Yellow   12   35   28

不匹配:

有时要浏览信息并抽取不匹配操作的记录,与~相反的符号是!~,意即不匹配。像原来使
用查询b r o w n腰带级别的匹配操作一样,现在看看不匹配情况。表达式$0 !~/brown/,意即查
询不包含模式b r o w n腰带级别的记录并打印它。
注意,缺省情况下, a w k将打印所有匹配记录,因此这里不必加入动作部分。

[root@localhost huangcd]# awk '$0 !~ /Brown/' grade.txt 
M.Tansley   05/99     48311  Green    8    40   44
J.Lulu      06/99     48317  green    9    24   26
P.Bunny     02/99     48     Yellow   12   35   28
[root@localhost huangcd]# awk '{if($4!~/Brown/) print $0}' grade.txt 
M.Tansley   05/99     48311  Green    8    40   44
J.Lulu      06/99     48317  green    9    24   26
P.Bunny     02/99     48     Yellow   12   35   28

如果只使用命令awk$4 !="brown"{print $0} grade.txt,将返回错误结果,因为用引号括起
了b r o w n,将只匹配‘b r o w n而不匹配b r o w n - 2和b r o w n - 3,

当然,如果想要查询非b r o w n - 2的腰带级别,可做如下操作:

[root@localhost huangcd]# awk '$4 != "Brown-2" {print $4}' grade.txt
Green
green
Yellow
Brown-3

看哪些学生可以获得升段机会。测试这一点即判断目前级别分f i e l d - 6是否小于最高分
f i e l d - 7,在输出结果中,加入这一改动很容易。

[root@localhost huangcd]# awk '{if($6<$7) print $1" Try better at net comp"}' grade.txt 
M.Tansley Try better at net comp
J.Lulu Try better at net comp

对比小于,小于等于只在操作符上做些小改动,满足此条件的记录也包括上面例子中的
输出情况。

[root@localhost huangcd]# awk '{if($6<=$7) print $1}' grade.txt 
M.Tansley
J.Lulu
J.Troll

大于符号大家都熟知,请看例子:
[root@localhost huangcd]# awk '{if($6>$7) print $1}' grade.txt 
P.Bunny
L.Tansley

设置大小写:

为查询大小写信息,可使用[ ]符号。在测试正则表达式时提到可匹配[ ]内任意字符或单词,
因此若查询文件中级别为g r e e n的所有记录,不论其大小写,表达式应为‘ / [ G g ] r e e n /:’

[root@localhost huangcd]# awk '/[Gg]reen/' grade.txt 
M.Tansley   05/99     48311  Green    8    40   44
J.Lulu      06/99     48317  green    9    24   26


抽取名字,其记录第一域的第四个字符是a,使用句点.。表达式/ ^ . . . a /意为行首前三个字
符任意,第四个是a,尖角符号代表行首。

[root@localhost huangcd]# awk '$1~/^...a/' grade.txt 
M.Tansley   05/99     48311  Green    8    40   44
L.Tansley   05/99     4712   Brown-2  12   30   28

为抽取级别为y e l l o w或b r o w n的记录,使用竖线符|。意为匹配| 两边模式之一。注意,使
用竖线符时,语句必须用圆括号括起来。

[root@localhost huangcd]# awk '$0~/(Yellow|Brown)/' grade.txt 
P.Bunny     02/99     48     Yellow   12   35   28
J.Troll     07/99     4842   Brown-3  12   26   26
L.Tansley   05/99     4712   Brown-2  12   30   28

不必总是使用域号。如果查询文本文件行首包含J的代码,可简单使用下面^符号:
[root@localhost huangcd]# awk '/^J/' grade.txt 
J.Lulu      06/99     48317  green    9    24   26
J.Troll     07/99     4842   Brown-3  12   26   26

复合模式或复合操作符用于形成复杂的逻辑操作,复杂程度取决于编程者本人。有必要
了解的是,复合表达式即为模式间通过使用下述各表达式互相结合起来的表达式:
&& AND : 语句两边必须同时匹配为真。
|| O R:语句两边同时或其中一边匹配为真。
! 非求逆

打印记录,使其名字为‘ P. B u n n y且级别为Ye l l o w,使用表达式( $ 1 = = " P. B u n n y " & &
$ 4 = = " Ye l l o w " ),意为& &两边匹配均为真。完整命令如下:

[root@localhost huangcd]# awk '{if($1=="P.Bunny" && $4=="Yellow") print $0}' grade.txt 
P.Bunny     02/99     48     Yellow   12   35   28

如果查询级别为Ye l l o w或B r o w n,使用或命令。意为“ | |”符号两边的匹配模式之一或全部为真。

[root@localhost huangcd]# awk '{if($4=="Yellow" || $4~/Brown/) print $0}' grade.txt 
P.Bunny     02/99     48     Yellow   12   35   28
J.Troll     07/99     4842   Brown-3  12   26   26
L.Tansley   05/99     4712   Brown-2  12   30   28

a w k有许多内置变量用来设置环境信息。这些变量可以被改变。表9 - 3显示了最常使用的
一些变量,并给出其基本含义。


A R G C支持命令行中传入a w k脚本的参数个数。A R G V是A R G C的参数排列数组,其中每
一元素表示为A R G V [ n ],n为期望访问的命令行参数。
E N V I R O N 支持系统设置的环境变量,要访问单独变量,使用实际变量名,例如
E N V I R O N [“E D I TO R”] =“Vi”。
F I L E N A M E支持a w k脚本实际操作的输入文件。因为a w k可以同时处理许多文件,因此如
果访问了这个变量,将告之系统目前正在浏览的实际文件。
F N R支持a w k目前操作的记录数。其变量值小于等于N R。如果脚本正在访问许多文件,
每一新输入文件都将重新设置此变量。
F S用来在a w k中设置域分隔符,与命令行中- F选项功能相同。缺省情况下为空格。如果用
逗号来作域分隔符,设置F S = ","。
N F支持记录域个数,在记录被读之后再设置。
O F S允许指定输出域分隔符,缺省为空格。如果想设置为#,写入O F S = " # "。
O R S为输出记录分隔符,缺省为新行( \ n)。
R S是记录分隔符,缺省为新行( \ n )。

NF、NR和FILENAME

要快速查看记录个数,应使用N R。比如说导出一个数据库文件后,如果想快速浏览记录
个数,以便对比于其初始状态,查出导出过程中出现的错误。使用N R将打印输入文件的记录
个数。print NR放在E N D语法中。

[root@localhost huangcd]# awk 'END {print NR}' grade.txt 
5

以下例子中,所有学生记录被打印,并带有其记录号。使用N F变量显示每一条读记录中
有多少个域,并在E N D部分打印输入文件名。

[root@localhost huangcd]# awk '{print NF,NR,$0} END{print FILENAME}' grade.txt 
7 1 M.Tansley   05/99     48311  Green    8    40   44
7 2 J.Lulu      06/99     48317  green    9    24   26
7 3 P.Bunny     02/99     48     Yellow   12   35   28
7 4 J.Troll     07/99     4842   Brown-3  12   26   26
7 5 L.Tansley   05/99     4712   Brown-2  12   30   28
grade.txt

在从文件中抽取信息时,最好首先检查文件中是否有记录。下面的例子只有在文件中至
少有一个记录时才查询B r o w n级别记录。使用A N D复合语句实现这一功能。意即至少存在一
个记录后,查询字符串B r o w n,最后打印结果。

[root@localhost huangcd]# awk '{if(NR>0 && $4~/Brown/) print $0}' grade.txt 
J.Troll     07/99     4842   Brown-3  12   26   26
L.Tansley   05/99     4712   Brown-2  12   30   28

N F的一个强大功能是将变量$ P W D的返回值传入a w k并显示其目录。这里需要指定域分隔
符/。

[root@localhost huangcd]# pwd
/home/huangcd
[root@localhost huangcd]# echo $PWD |awk -F / '{print $NF}'
huangcd
[root@localhost huangcd]# echo "usr/local/etc/rc.sybase" |awk -F / '{print $NF}' 
rc.sybase


设置输入域到域变量名:

在a w k中,设置有意义的域名是一种好习惯,在进行模式匹配或关系操作时更容易理解。
一般的变量名设置方式为n a m e = $ n,这里n a m e为调用的域变量名, n为实际域号。例如设置学
生域名为n a m e,级别域名为b e l t,操作为n a m e = $ 1 ; b e l t s = $ 4。注意分号的使用,它分隔a w k命
令。下面例子中,重新赋值学生名域为n a m e,级别域为b e l t s。查询级别为Ye l l o w的记录,并
最终打印名称和级别。

[root@localhost huangcd]# awk '{name=$1;belts=$4; if(belts~/Yellow/) print name " is belt" belts}' grade.txt 
P.Bunny is beltYellow

通常在B E G I N部分赋值是很有益的,可以在a w k表达式进行改动时减少很多麻烦。

第二个例子中给数字赋以变量名B A S E L I N E和在B E G I N部分给变量赋值,两者意义相同。

[root@localhost huangcd]# awk 'BEGIN {BASELINE="27"} {if($6<BASELINE) print $0}' grade.txt 
J.Lulu      06/99     48317  green    9    24   26
J.Troll     07/99     4842   Brown-3  12   26   26

当在a w k中修改任何域时,重要的一点是要记住实际输入文件是不可修改的,修改的只是
保存在缓存里的a w k复本。a w k会在变量N R或N F变量中反映出修改痕迹。

为修改数值域,简单的给域标识重赋新值,如: $ 1 = $ 1 + 5,会将域1数值加5,但要确保赋
值域其子集为数值型。
修改M . Ta n s l e y的目前级别分域,使其数值从4 0减为3 9,使用赋值语句$ 6 = $ 6 - 1,当然在
实施修改前首先要匹配域名。

[root@localhost huangcd]# awk '{if($1=="M.Tansley") $6=$6-1; print $1,$6,$7}' grade.txt
M.Tansley 39 44
J.Lulu 24 26
P.Bunny 35 28
J.Troll 26 26
L.Tansley 30 28



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/huang2009303513/article/details/16973287

智能推荐

oracle 12c 集群安装后的检查_12c查看crs状态-程序员宅基地

文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态

解决jupyter notebook无法找到虚拟环境的问题_jupyter没有pytorch环境-程序员宅基地

文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境

国内安装scoop的保姆教程_scoop-cn-程序员宅基地

文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn

Element ui colorpicker在Vue中的使用_vue el-color-picker-程序员宅基地

文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker

迅为iTOP-4412精英版之烧写内核移植后的镜像_exynos 4412 刷机-程序员宅基地

文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机

Linux系统配置jdk_linux配置jdk-程序员宅基地

文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk

随便推点

matlab(4):特殊符号的输入_matlab微米怎么输入-程序员宅基地

文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入

C语言程序设计-文件(打开与关闭、顺序、二进制读写)-程序员宅基地

文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。‍ Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。

Touchdesigner自学笔记之三_touchdesigner怎么让一个模型跟着鼠标移动-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动

【附源码】基于java的校园停车场管理系统的设计与实现61m0e9计算机毕设SSM_基于java技术的停车场管理系统实现与设计-程序员宅基地

文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计

Android系统播放器MediaPlayer源码分析_android多媒体播放源码分析 时序图-程序员宅基地

文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;amp;gt;Jni-&amp;amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图

java 数据结构与算法 ——快速排序法-程序员宅基地

文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法