10月18日任务

10月18日任务
9.6/9.7 awk

9.6 awk(上)

操作指引

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

cat test.txt
test.txt的数据,方便后面查看

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

准备工作
mkdir awk
cp /etc/passwd awk/test.txt
cd awk/
ls
test.txt
awk截取功能
指定:分隔符,把第一段打印出来。
awk -F ':' '{print $1}' test.txt
root
bin
daemon
adm
lp
sync
shutdown
$1表示第一个字段,$2表示第二个字段,$0表示一整行

awk -F ':' '{print $0}' test.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

# awk -F ':' '{print $0}' test.txt 与# awk  '{print $0}' test.txt 效果是一样的,其实就是与#cat test.txt效果一样。
如果awk 忽略了-F(没有指定分隔符),默认将会以空格、空白字符为分隔符去打印。

指定字段打印:
awk -F ':' '{print$1,$3,$4}' test.txt
root 0 0
bin 1 1
daemon 2 2
adm 3 4
lp 4 7
sync 5 0
shutdown 6 0
halt 7 0
mail 8 12
operator 11 0
games 12 100
ftp 14 50
nobody 99 99

指定以#分隔。
awk -F ':' '{print$1"#"$3"#"$4}' test.txt
root#0#0
bin#1#1
daemon#2#2
adm#3#4
lp#4#7
sync#5#0
shutdown#6#0
halt#7#0
mail#8#12
operator#11#0
games#12#100
ftp#14#50

awk匹配功能
匹配oo的字符串
awk '/oo/' test.txt
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
匹配第一段oo的字符串
awk -F ':' '$1~/oo/' test.txt
root:x:0:0:root:/root:/bin/bash
针对段来匹配,awk是比之前2个(grep,sed)要强大的。
同样也支持正则表达式o+来使用,o+的+代表一个或多个以上。
awk -F ':' '$1~/o+/' test.txt
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
operator:x:11:0:operator:/root:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
oo+
awk -F ':' '$1~/oo+/' test.txt
root:x:0:0:root:/root:/bin/bash
+
在grep上,需要用egrep才支持+使用,
sed上,需要用-r选项来脱义
但是awk,可以直接使用,

多个表达式一起写。
先匹配root字符串的1,3段,
再匹配user字符串的1,3,4段。
awk -F ':' '/root/ {print $1,$3} /user/ {print$1,$3,$4}' test.txt
root 0
operator 11
user1 1001 1001
user5 1002 1002

匹配root或者user的字符串
egrep 'root|user' test.txt

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

awk -F ':' '/root|user/ {print $0}' test.txt
用法也一样效果。

条件操作符
数学运算表达式
"==" ">=" "<=" 记住,加""与不加""是不用效果。加双引号,awk会认为是字符,不加双引号会被认为是数字。
=是赋值,==是等于.
awk -F ':' '$3==0' test.txt
root:x:0:0:root:/root:/bin/bash
第三段等于0的行
awk -F ':' '$3==0 {print $1}' test.txt
root
第三段等于0 打印打第一个字符串。
awk -F ':' '$3>=1000 {print $1}' test.txt
aming
user1
user5
第三段大于等于1000,打印打第一个字符段。这种用法很方便我们查看以后用户的UID。
awk -F ':' '$3>=1000 {print $0}' test.txt
aming:x:1000:1000::/home/aming:/bin/bash
user1:x:1001:1001::/home/user1:/bin/bash
user5:x:1002:1002::/home/user5:/bin/bash
第三段大于等于1000,并打印整行($0表示整行)。

双引号用法
针对数字的话 就不要加双引号。

不等于 !=
第七段不等于/sbin/nologin $7!=/sbin/nologin
awk -F ':' '$7!="/sbin/nologin" {print $0 }' test.txt
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
aming:x:1000:1000::/home/aming:/bin/bash
user1:x:1001:1001::/home/user1:/bin/bash
user5:x:1002:1002::/home/user5:/bin/bash
记住 字符串要加""

9.7 awk(下)

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
第三段小于第四段
awk -F ':' '$3<$4' test.txt
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
&&并且用法
awk -F ':' '$3>"5" && $3<"7"' test.txt
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
第三段大于字符5,并且小于7.

||或者用法
awk -F ':' '$3>1000 || $7=="/bin/bash"' test.txt
root:x:0:0:root:/root:/bin/bash
aming:x:1000:1000::/home/aming:/bin/bash
user1:x:1001:1001::/home/user1:/bin/bash
user5:x:1002:1002::/home/user5:/bin/bash
awk内置变量{OFS="#"}
OFS指定print时的分隔符,例如将:换成#,则{OFS="#"}
语法注意,先-F ':' 然后紧接写{OFS="#"},再条件,最后print语句.如果不写条件,则显示全部内容.
记住print字段一定要加,(示例$1,$3,$7),不然无效.
# awk -F ':' '{OFS="#"} $3>1000 || $7 ~/bash/  {print $1,$3,$7}' test.txt
root#0#/bin/bash
aming#1000#/bin/bash
user1#1001#/bin/bash
user5#1002#/bin/bash
用#分隔,第三个字段>1000或者第七个字段匹配bash.

if用法.
if语法 {if条件{print语句}}
[root@centos7 awk]# awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$2,$3,$4}}' test.txt
user1#x#1001#1001
user5#x#1002#1002
变量NR 行 (有点像#grep -n功能)
用法{print NR} NR后面可以引用分隔符 例如{print NR":"}
awk -F ':' '{print NR":"$0}' test.txt
1:root:x:0:0:root:/root:/bin/bash
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:halt:x:7:0:halt:/sbin:/sbin/halt
NF 段
awk -F ':' '{print NF":"$0}' test.txt
7:root:x:0:0:root:/root:/bin/bash
7:bin:x:1:1:bin:/bin:/sbin/nologin
7:daemon:x:2:2:daemon:/sbin:/sbin/nologin
7:adm:x:3:4:adm:/var/adm:/sbin/nologin
7:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
7:sync:x:5:0:sync:/sbin:/bin/sync
NF NR 判断条件
NR段值小于等于10,
awk -F ':' 'NR<=10' test.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
NR段值少于10,并且第一段 匹配root或者sync的行
awk -F ':' 'NR<=10 && $1 ~ /root|sync/' test.txt
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
# vi test.txt
rootx:0:0:root:/root:/bin/bash
NF用法 行号
把第一个:去掉,7段改成6段.
awk -F ':' 'NF==6 && $1 ~ /root|sync/' test.txt
rootx:0:0:root:/root:/bin/bash
!!!!!!!!!!!!!!!!!!!!!!!!!!
awk -F ':' '{print $NR":"$NF}' test.txt
rootx:/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
:/sbin/nologin
:/sbin/nologin
:/sbin/nologin
:/sbin/nologin
:/sbin/nologin
:/sbin/nologin
:/sbin/nologin
:/sbin/nologin
:/sbin/nologin
'$1=="root"' 等于 匹配作用 等
head -n 3 /etc/passwd |awk -F ':' '$1=="root"'
root:x:0:0:root:/root:/bin/bash
'$1="root"'  赋值作用
head -n 3 /etc/passwd |awk -F ':' '$1="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
赋值后需要加分隔符,利用OFS变量
head -n 3 test.txt |awk -F ':' '{OFS=":"}$1="root"'
root:0:0:root:/root:/bin/bash
root:x:1:1:bin:/bin:/sbin/nologin
root:x:2:2:daemon:/sbin:/sbin/nologin
!!!!计算第三段的总和
awk -F ':' '{tot=tot+$3}; END {print tot}' test.txt
5608
第一次使用的话,tot=0,所以,此时tot的值等于$3的总和.
也就是$3的总和等于 第一段的第三个字符+第二段第三个字符+第三段的第三个字符+.+.+.+.+.+尽头

扩展
把这里面的所有练习题做一下
http://www.apelearn.com/study_v2/chapter14.html

转载于:https://my.oschina.net/u/3960075/blog/2249018

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值