您的位置:首页 > 其它

正则三剑客-awk

2017-08-04 00:00 99 查看
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 //
3ff0
第三段大于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:表示段

# 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

[root@zhdy-02 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 //打印出前十行

[root@zhdy-02 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的行


[root@zhdy-01 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段。


[root@zhdy-01 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

[root@zhdy-01 awk]# awk -F ':' '{(tot=tot+$3)}; END{print tot}' passwd

5945

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


在日常的运维工作当中,我们一般会把正则应用到shell脚本当中,熟能生巧!多练习才是王道!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  正则