linux中三剑客之一awk命令的用法

简介

一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。

语法

awk [选项参数]      'pattern1{action1} pattern2{action2}...' filename

pattern:表示AWK在数据中查找的内容,也就是匹配模式

action:在找到匹配内容时所执行的一系列命令

常用选项

-F定义分割符,默认为空格或tab,也可以使用正则来表示分割符,例如:-F  "[ :]+"   表示遇见多空格或者多:统一看成一个分割
-v定义临时变量
-f指定awk执行脚本式的awk文件,例子:awk -f   awk脚本文件   数据文件

内置变量

$0记录变量,当前正在处理的记录
$n字段变量,其中n为整数,且n大于1,表示第n个字段的值。(列变量,$2即为第2列)
NF整数值,表示当前记录(变量$0所代表的记录)的字段数(可以表示最后一列)
NR整数值,表示awk已经读入的记录数(行变量)
FILENAME表示正在处理的数据文件的名称  
FS字段分隔符,默认值是空格或者制表符(列)
RS记录分隔符,默认值是换行符,(行)

匹配模式

以下案例以以下两个文件为主

[root@master test1]# cat data.txt 
John    85      92      79      87
Mancy   89      90      73      82
Tom     81      88      92      81
Kity    79      65      83      90
Han     92      89      80      83
Kon     88      76      85      97
 

[root@master test1]# cat awk_test.txt 
Zhao    Dan        43917327    :210:103:145
Zhang   Xiaoxue    3936742308  :125:90:201
Meng    Lisha      4005427091  :220:60:50
Wu      Xiaowei    702234141   :220:80:275
Liu     Xiaobing   812117483   :230:101:154
Wang    Xiaoli     3512424655  :50:95:135
Zhou    Jiaxiang   1988989880  :153:198:221
Li      Guangyu    9128380305  :175:75:230
 

关系表达式

简介

        awk提供了许多关系运算符,如大于>、小于<或者等于==等,awk允许用户使用关系表达式作为匹配模式,当某个文本行满足关系表达式时,将会执行相应的操作。

        注意以下例子的格式,awk是一行一行读取操作的,与sed相同

案例

1. 第二行大于90的显示所有内容

[root@centos7 ~]# awk '$2 > 90 {print}' data.txt

Han   92    89    80    83

解析:

print为打印前面匹配模式成功的结果
$2表示指定按默认空格分割的第二列
特殊:$0表示全部

2. 第二列大于90的显示第一列和第二列的内容

[root@centos7 ~]# awk '$2 > 90 {print  $1,$2}' data.txt

Han 92

 解析:

{}中也可以通过调用$n指定打印的列内容,其中","表示分割不同的列

正则表达式

简历

        awk支持以正则表达式作为匹配模式,与sed一样,用户需要将正则表达式放在两条斜线中间,其基本语法如下:

        注意以下格式,正则不仅在条件中可以使用,还可以在分割符中使用

条件正则

1. 输出以M或T开头的行

[root@centos7 ~]# awk '/^M|^T/{print}' data.txt

Mancy  89    90    73    82

Tom   81    88    92    81

解析:

语法格式 :  awk   '/条件正则/{行为}'  文件

分割正则

shadown文件内容

K3bsfOTa/LtJeR.:19531:0:99999:7:::

bin:*:18353:0:99999:7:::

daemon:*:18353:0:99999:7:::

1. 取出shadow中的过期后保留时间

[root@master test1]# awk -F "[:]+" '{print $(NF-1)}' shadow

7

7

7

解析:

-F 分割符
这里的[:]+ 采用正则形式,表示至少一个或多个:统一看成一个分割
NF为最后一列,我们取的的是导数第二列,所以减去一

混合表达式

简历

awk不仅支持单个的关系表达式或者正则表达式作为模式,还支持使用逻辑运算符“&&”“||”或者“!”,将多个表达式组合起来作为一个模式。

案例

1. 查询data.txt文件中,以K为首的行并且第三列大于70的行

[root@centos7 ~]# awk '/^K/&&$3 > 70{print}' data.txt

Kon   88    76    85    97

2. 查询data.txt文件中,以K为首或者第三列大于70的行

[root@master test1]# awk '/^K/ || $3>70 {print} ' data.txt

John 85 92 79 87

Mancy 89 90 73 82

Tom 81 88 92 81

Kity 79 65 83 90

Han 92 89 80 83

Kon 88 76 85 97

区间模式

简介

也就是说通过模式可以匹配一段连续的文本行,区间模式的语法如下:
awk   'pattern1,pattern2{action}'  filename

案例

1. 获取data.txt文件中以Mancy开头的行到以第二列的值等于92的行之间的行内容

[root@centos7 ~]# awk '/^Mancy/,$2==92{print}' data.txt

Mancy  89    90    73    82
Tom   81    88    92    81

Kity   79    65    83    90

Han   92    89    80    83

2. 获取data.txt文件中以M开头的行到以H开头的行之前的行内容

[root@centos7 ~]# awk '/^M/,/^H/{print}' data.txt

Mancy  89    90    73    82

Tom   81    88    92    81

Kity   79    65    83    90

Han   92    89    80    83

3. 获取data.txt文件中第二列的值等于85到第三列的值为89的行之间的行内容

[root@centos7 ~]# awk '$2 == 85,$3 == 89{print}' data.txt

John   85    92    79    87

Mancy  89    90    73    82

Tom   81    88    92    81

Kity   79    65    83    90

Han   92    89    80    83

4.  获取awk_test.txt文件中第二列包含Xiaoxue和Xiaobing名字的行

[root@master test1]# awk '$2~/Xiaoxue/;$2~/Xiaobing/' awk_test.txt

Zhang Xiaoxue 3936742308 :125:90:201

Liu Xiaobing 812117483 :230:101:154

解析:

$n~ 表示以哪一列为限制域,后面跟着可跟正则或关系,对该域内容进行判定

注意:在使用区间模式时,一定要注意前后的边界,如果有多个行符合匹配模式,则awk会匹配第一次符合要求的行。

BEGIN模式

简介

        BEGIN模式是一种特殊的内置模式,其成立的时机为awk程序刚开始执行,但是又尚未读取任何数据之前,因此,该模式所对应的操作仅仅被执行一次,当awk读取数据之后,BEGIN模式便不再成立,所以用户可以将与数据文件无关,而且在整个程序的生命周期内,只需执行一次的代码放在BEGIN模式对应的操作中。

案例

1. #修改awk内置变量 了解

awk -F: 'NR==1{print $1}' passwd

awk  'BEGIN{FS=":"} NR==1{print $1}' passwd

解析:

这里的FS指的是分割符变量,与-F意思相同

2. 在/etc/ssh/sshd_config中过滤出包含permitrootlogin或usedns的行,忽略大小写

awk 'BEGIN{IGNORECASE=1}/permitrootlogin|usedns/{print}' /etc/ssh/sshd_config

解析:这里的IGNORECASE=1开启忽略大小写

END模式

简介

        END模式是awk的另外一种特殊模式,该模式成立的时机与BEGIN模式恰好相反,它是在awk命令处理完所有的数据,即将退出程序时成立,在此之前,END模式并不成立,无论数据文件中包含有多少行数据,在整个程序的生命周期中,该模式所对应的操作只被执行一次,因此,用户可以将许多善后工作放在END模式对应的操作中。

案例

1. 统计/etc/services 文件中空行的数量

awk '/^$/{j++} END{print j}' /etc/services

17

特殊意义的一些用法:

特殊一:列域

简介

判定某个列为域,以该域为内容,对其进行法则判定

语法:awk  [选项]   '$列号~/法则/{action}'    filename

案例

1. 判定出awk_test.txt文件中第二列包含Xiaoxue和Xiaobing名字的行

[root@master test1]# awk '$2~/Xiaoxue/;$2~/Xiaobing/' awk_test.txt

Zhang Xiaoxue 3936742308 :125:90:201

Liu Xiaobing 812117483 :230:101:154

特殊二:替换符

简介

替换值中的某些指定的内容

语法:

awk  [选项]  '/法则/{gsub(/需要替换的内容/,"替换的内容",修改哪一列);print 列号}'

awk [选项] '$列号~/法则/{gsub(/需要替换的内容/,"替换的内容",修改哪一列);print 列号}'

案例

1. awk [选项] '$列号~/法则/{gsub(/需要替换的内容/,"替换的内容",修改哪一列);print 列号}'

[root@zhong ~]# awk '$2~/Xiaoxue/{print $NF}' awk_test.txt

:125:90:201

[root@zhong ~]# awk '$2~/Xiaoxue/{gsub(/:/,"$",$NF);print $NF}' awk_test.txt

$125$90$201

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值