前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >正则三剑客-awk

正则三剑客-awk

作者头像
老七Linux
发布2018-05-09 15:54:36
8090
发布2018-05-09 15:54:36
举报

awk与前两个不同之处是支持分段处理;

#mkdir awk; cp /etc/passwd awk/passwd         //前期准备,创建一个awk目录并copy passwd到 awk目录下。

# awk -F ‘:’ ‘{print $1}’ passwd               -F:指定分隔符 //打印passwd的第一段

$1:第一段 ,$2:第二段,$0:整行

# awk -F ‘:’ ‘{print $0}’ passwd              -F:指定分隔符 //打印passwd的整行全部内容

如果不指定分隔符,默认是空格

# awk -F ‘:’ ‘{print $1,$3,$4}’ passwd                //同时打印第1,3,4段

#awk -F ‘:’ ‘{print $1“#”$3“#”$4}’ passwd          //指定打印结果以某个字符分割


AWK的匹配功能:

# awk ‘/oo/’ passwd            //匹配oo的行

# awk -F ‘:’ ‘$1 ~ /oo/’ passwd            //精确匹配第一段包含oo的行

# awk -F ‘:’ ‘$1 ~ /o+/’ passwd                //精确匹配第一段包含o一次或多次的行

#awk -F ‘:’ ‘/root/{print $1″@”$3} /user/ {print $3,$4}’ passwd                 //匹配root的行打印第一段和第三段并且使用@隔断;且同时匹配user的行打印第三段和第四段

# awk -F ‘:’ ‘/root|user/ {print $0}’ passwd               //测试上面的是否正确,同时使用这种写法别上面更容易理解

# awk -F ‘:’ ‘$3>=1000 {print $0}’ passwd              //第三段大于等于1000的打印整行

# awk -F ‘:’ ‘$3==1000 {print $0}’ passwd                  //第三段等于1000的打印整行(注意是==),如果写成了=既代表着赋值

# awk -F ‘:’ ‘$3>=“1000” {print $0}’ passwd             //第三段Ascll码大于等于1000的打印整行如果针对数字一定不要添加“”

# awk -F ‘:’ ‘$7!=”/sbin/nologin” {print $0}’ passwd              //打印出第七段不等于/sbin/nologin的行!(如果是字符串,一定要加双引号)


AWK的数学运算功能:

# awk -F ‘:’ ‘$3<=$4 {print $0}‘ passwd           //打印出第四段大于等于第三段的行

# awk -F ‘:’ ‘$3>”5″ && $4<“7” {print $0}’ passwd          //第三段大于”5“第四段小于”7“的行(这里的5和7均是双引号,代表着ascll码) && 必须要同时满足两个条件

# awk -F ‘:’ ‘$3>1000 || $7==”/sbin/nologin” {print $0}’ passwd               //第三段大于1000 或者 第7段等于/sbin/nologin的行 || 满足任意一个都会打印出来

# awk -F ‘:’ ‘$3>1000 || $4 ~ /bash/ {print $0}’ passwd             //第三段大于1000 或者 匹配第7段为bash的行

# awk -F ‘:’ ‘{OFS=”#”}$3>1000 || $4 ~ /bash/ {print $1,$3,$4}‘ passwd                 OFS:指定分隔符(记得添加双引号) //指定分隔符为#然后打印出符合条件的段

# awk -F ‘:’ ‘{OFS=”#”} {print $1,$3,$4}’ passwd                //打印所有的行中的第1,3,4段

# awk -F ‘:’ ‘{OFS=”#”} {if($3>1000) {print $1,$3,$4}}‘ passwd            //指定打印第三段大于1000的行然后打印第1,3,4,段(注意{})


NR:表示行    NF:表示段

代码语言:javascript
复制
# awk -F ':' '{print NR"#"$0}' passwd          //打印行号,类似于grep -n

1#root:x:0:0:root:/root:/bin/bash

2#bin:x:1:1:bin:/bin:/sbin/nologin
代码语言:javascript
复制
[[email protected] awk]# awk -F ':' '{print NF"#"$0}' passwd             //打印每行有多少段

7#root:x:0:0:root:/root:/bin/bash

7#bin:x:1:1:bin:/bin:/sbin/nologin

# awk -F ‘:’ ‘NR<=10’ passwd                //打印出前十行

代码语言:javascript
复制
[[email protected] awk]# awk -F ':' 'NR<=10 && $1 ~ /root|sync/' passwd

root:x:0:0:root:/root:/bin/bash

sync:x:5:0:sync:/sbin:/bin/sync

//打印前十行,且第一段包含root或sync的行

代码语言:javascript
复制
[[email protected] awk]# awk -F ':' '{print $NR"#"$NF}' passwd

root#/bin/bash

x#/sbin/nologin

2#/sbin/nologin

4#/sbin/nologin

lp#/sbin/nologin

/sbin#/bin/sync

/sbin/shutdown#/sbin/shutdown

#/sbin/halt

#/sbin/nologin

//NR从1开始,$1是第1行第7段,$2是第2行第7段,。。。$7是第7行第7段。

代码语言:javascript
复制
[[email protected] awk]# awk -F ':' '{OFS=":"} $1="ROOT"' passwd     //把第一段全部赋值“ROOT”

ROOT:x:0:0:root:/root:/bin/bash

ROOT:x:1:1:bin:/bin:/sbin/nologin

ROOT:x:2:2:daemon:/sbin:/sbin/nologin

ROOT:x:3:4:adm:/var/adm:/sbin/nologin
代码语言:javascript
复制
[[email protected] awk]# awk -F ':' '{(tot=tot+$3)}; END{print tot}' passwd

5945

//自定义一个tot,把第三段求和

在日常的运维工作当中,我们一般会把正则应用到shell脚本当中,熟能生巧!多练习才是王道!!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016/07/05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档