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:表示段
# 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
[[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 //打印出前十行
[[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的行
[[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段。
[[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
[[email protected] awk]# awk -F ':' '{(tot=tot+$3)}; END{print tot}' passwd
5945
//自定义一个tot,把第三段求和
在日常的运维工作当中,我们一般会把正则应用到shell脚本当中,熟能生巧!多练习才是王道!!