博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【2018.04.27学习笔记】【linux基础知识9.6-9.7】
阅读量:6831 次
发布时间:2019-06-26

本文共 8636 字,大约阅读时间需要 28 分钟。

hot3.png

9.6 awk(上)

awk其实是一种程序设计语言,叫样式扫描和处理语言。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

命令格式:awk [选项] ' 模式 = ( {内置变量} + 表达式 + {动作} ) ' 文件名

表达式里可以是正则表达式:里面的查找关键词用 / /号括起来,如 /root/ 。 其中 “模式” 表示 awk 在数据中查找的内容、规则表达式和操作动作。花括号({ })不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。

awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。

通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。

常用的awk功能是指定分隔符,对文件的行进行分段,然后再处理。

awk -F ':' '{print $1}' 1.txt :指定用:号分隔行为几段,输出打印第一段。

-F 指定分隔符的选项: $1 表示第一段,$0 表示所有段。

[root@lgs-01 awk]# awk -F ':' '{print $1}' passwdtest rootbindaemonadmlpsyncshutdownhaltmailoperatorgamesftpnobodysystemd-networkdbuspolkitdpostfixsshdchronylgsabc[root@lgs-01 awk]# awk -F ':' '{print $0}' passwdtest root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologinftp:x:14:50:FTP User:/var/ftp:/sbin/nologinnobody:x:99:99:Nobody:/:/sbin/nologinsystemd-network:x:192:192:systemd Network Management:/:/sbin/nologindbus:x:81:81:System message bus:/:/sbin/nologinpolkitd:x:999:997:User for polkitd:/:/sbin/nologinpostfix:x:89:89::/var/spool/postfix:/sbin/nologinsshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologinchrony:x:998:996::/var/lib/chrony:/sbin/nologinlgs:x:1008:1000::/home/lgs:/bin/bashabc:x:1001:1000::/home/abc:/bin/bash

不用-F指定分隔符,默认以“空格” 或者“空白字符”为分隔符。

awk -F ':' '{print $2,$6,$7}':打印多个段,以逗号,割开写,也可以用#号隔开写

[root@lgs-01 awk]# awk -F ':' '{print $2,$6,$7}' passwdtest x /root /bin/bashx /bin /sbin/nologinx /sbin /sbin/nologinx /var/adm /sbin/nologinx /var/spool/lpd /sbin/nologinx /sbin /bin/syncx /sbin /sbin/shutdownx /sbin /sbin/haltx /var/spool/mail /sbin/nologinx /root /sbin/nologinx /usr/games /sbin/nologinx /var/ftp /sbin/nologinx / /sbin/nologinx / /sbin/nologinx / /sbin/nologinx / /sbin/nologinx /var/spool/postfix /sbin/nologinx /var/empty/sshd /sbin/nologinx /var/lib/chrony /sbin/nologinx /home/lgs /bin/bashx /home/abc /bin/bash

awk -F ':' '$1 ~ /oo/' 1.txt :第一段中包含oo的行。~号表示指定段落里包含oo的匹配

[root@lgs-01 awk]# awk -F ':' '$1 ~ /oo/' passwdtest root:x:0:0:root:/root:/bin/bash

awk -F ':' '$7~ /binn+/' 1.txt:支持正则,可以不用加转义字符。

[root@lgs-01 awk]# awk -F ':' '$7~ /binn+/' passwdtest 1:2:3:4:5:6:binnn

支持运算符:

awk -F ':' '$3>=200 {print $0}' 1.txt :如果 第三段大于等于0,就输出打印匹配行的所有段。

[root@lgs-01 awk]# awk -F ':' '$3>=200 {print $0}' passwdtest polkitd:x:999:997:User for polkitd:/:/sbin/nologinchrony:x:998:996::/var/lib/chrony:/sbin/nologinlgs:x:1008:1000::/home/lgs:/bin/bashabc:x:1001:1000::/home/abc:/bin/bash

运算字符串要加" "号括起来:

awk -F ':' '$7!="/sbin/nologin" {print $0}' 1.txt:如果第7段不等于sbin,就输出打印匹配行的所有段。

[root@lgs-01 awk]# awk -F ':' '$7!="/sbin/nologin" {print $0}' passwdtest root:x:0:0:root:/root:/bin/bashsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltlgs:x:1008:1000::/home/lgs:/bin/bashabc:x:1001:1000::/home/abc:/bin/bash

awk -F ':' '$3>$4' test.txt :第3段与第4段的对比。

[root@lgs-01 awk]# awk -F ':' '$3>$4 {print $0}' passwdtest sync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltoperator:x:11:0:operator:/root:/sbin/nologinpolkitd:x:999:997:User for polkitd:/:/sbin/nologinchrony:x:998:996::/var/lib/chrony:/sbin/nologinlgs:x:1008:1000::/home/lgs:/bin/bashabc:x:1001:1000::/home/abc:/bin/bash12:22:55

多个条件 匹配:

awk -F ':' '$3>5 && $4<7' 1.txt:第3段大于5,并且第4段小于7

[root@lgs-01 ~]# awk -F ':' '$3>5 && $4<7' passwdtest shutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltoperator:x:11:0:operator:/root:/sbin/nologin12:22:55

awk -F ':' '{OFS="#"} $3>1000 || $4<5 {print $1,$2,$3,$4} ' 1.txt:OFS变量,指定分隔符#号 输出打印指定段

[root@lgs-01 ~]# awk -F ':' '{OFS="#"} $3>1000 || $4<5 {print $1,$2,$3,$4}' passwdtest root#x#0#0bin#x#1#1daemon#x#2#2adm#x#3#4sync#x#5#0shutdown#x#6#0halt#x#7#0operator#x#11#0lgs#x#1008#1000abc#x#1001#100012#22#55#587#1##12#21##12#200##1###9###51###59###abc#0##abc#y##

9.7 awk(下)

awk -F ':' '{print NR ": " $0}' 1.txt:NR变量,显示行号。

[root@lgs-01 ~]# awk -F ':' '{print NR ": " $0}' passwdtest 1: root:x:0:0:root:/root:/bin/bash2: bin:x:1:1:bin:/bin:/sbin/nologin3: daemon:x:2:2:daemon:/sbin:/sbin/nologin4: adm:x:3:4:adm:/var/adm:/sbin/nologin5: lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6: sync:x:5:0:sync:/sbin:/bin/sync7: shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8: halt:x:7:0:halt:/sbin:/sbin/halt9: mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10: operator:x:11:0:operator:/root:/sbin/nologin11: games:x:12:100:games:/usr/games:/sbin/nologin12: ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin13: nobody:x:99:99:Nobody:/:/sbin/nologin14: systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin15: dbus:x:81:81:System message bus:/:/sbin/nologin16: polkitd:x:999:997:User for polkitd:/:/sbin/nologin17: postfix:x:89:89::/var/spool/postfix:/sbin/nologin18: sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin19: chrony:x:998:996::/var/lib/chrony:/sbin/nologin20: lgs:x:1008:1000::/home/lgs:/bin/bash21: abc:x:1001:1000::/home/abc:/bin/bash

awk -F ':' 'NF==7 && $1 ~/root|sync/' 1.txt: NF变量,每行的段数。当NF等于7,且第一段含root或者a的,输出打印匹配的行。

[root@lgs-01 ~]# awk -F ':' 'NF==7 && $1 ~/root|a/' passwdtest root:x:0:0:root:/root:/bin/bashdaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinhalt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologinabc:x:1001:1000::/home/abc:/bin/bash

awk -F ':' '{print $NR ":" $NF}' 1.txt:输出打印每行的第NR段:第NF段的字符对。NR、NF是一个数字变量,是每行的行号和段数。

当NR和NF前面不加 $号的时候: NR : NF,输出的是每行的 行号: 段数

[root@lgs-01 ~]# awk -F ':' '{print $NR ": " $NF } ' passwdtest root: /bin/bashx: /sbin/nologin2: /sbin/nologin4: /sbin/nologinlp: /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: /sbin/nologin: /bin/bash: /bin/bash[root@lgs-01 ~]# awk -F ':' '{print NR ": " NF } ' passwdtest 1: 72: 73: 74: 75: 76: 77: 78: 79: 710: 711: 712: 713: 714: 715: 716: 717: 718: 719: 720: 721: 7

awk -F ':' '$1="root"' 1.txt:=号,赋值的意思。:把所有行的第一段内容赋值为root。赋值后输出结果中,分隔符会消失,可以用OFS=":"定义。

[root@lgs-01 ~]# awk -F ':' '$1="root"' passwdtest root x 0 0 root /root /bin/bashroot x 1 1 bin /bin /sbin/nologinroot x 2 2 daemon /sbin /sbin/nologinroot x 3 4 adm /var/adm /sbin/nologinroot x 4 7 lp /var/spool/lpd /sbin/nologinroot x 5 0 sync /sbin /bin/syncroot x 6 0 shutdown /sbin /sbin/shutdownroot x 7 0 halt /sbin /sbin/haltroot x 8 12 mail /var/spool/mail /sbin/nologinroot x 11 0 operator /root /sbin/nologinroot x 12 100 games /usr/games /sbin/nologinroot x 14 50 FTP User /var/ftp /sbin/nologinroot x 99 99 Nobody / /sbin/nologinroot x 192 192 systemd Network Management / /sbin/nologinroot x 81 81 System message bus / /sbin/nologinroot x 999 997 User for polkitd / /sbin/nologinroot x 89 89  /var/spool/postfix /sbin/nologinroot x 74 74 Privilege-separated SSH /var/empty/sshd /sbin/nologinroot x 998 996  /var/lib/chrony /sbin/nologinroot x 1008 1000  /home/lgs /bin/bashroot x 1001 1000  /home/abc /bin/bash[root@lgs-01 ~]# awk -F ':' '{OFS="#" } $1="root"' passwdtest root#x#0#0#root#/root#/bin/bashroot#x#1#1#bin#/bin#/sbin/nologinroot#x#2#2#daemon#/sbin#/sbin/nologinroot#x#3#4#adm#/var/adm#/sbin/nologinroot#x#4#7#lp#/var/spool/lpd#/sbin/nologinroot#x#5#0#sync#/sbin#/bin/syncroot#x#6#0#shutdown#/sbin#/sbin/shutdownroot#x#7#0#halt#/sbin#/sbin/haltroot#x#8#12#mail#/var/spool/mail#/sbin/nologinroot#x#11#0#operator#/root#/sbin/nologinroot#x#12#100#games#/usr/games#/sbin/nologinroot#x#14#50#FTP User#/var/ftp#/sbin/nologinroot#x#99#99#Nobody#/#/sbin/nologinroot#x#192#192#systemd Network Management#/#/sbin/nologinroot#x#81#81#System message bus#/#/sbin/nologinroot#x#999#997#User for polkitd#/#/sbin/nologinroot#x#89#89##/var/spool/postfix#/sbin/nologinroot#x#74#74#Privilege-separated SSH#/var/empty/sshd#/sbin/nologinroot#x#998#996##/var/lib/chrony#/sbin/nologinroot#x#1008#1000##/home/lgs#/bin/bashroot#x#1001#1000##/home/abc#/bin/bash

awk -F ':' '{(tot=tot+$3); END {print tot}}' 1.txt:求和一列。tot从0开始,累加每行的第三段的内容,直到尾行结束,然后输出toto的值。有变量的地方,都用{ }花括号括起来。

[root@lgs-01 ~]# awk -F ':' '{(tot=tot+$3)}; END {print tot}' passwdtest 4669

转载于:https://my.oschina.net/u/3804114/blog/1802567

你可能感兴趣的文章
linux学习计划第一周
查看>>
Dubbo的一次体验与分析
查看>>
工厂模式
查看>>
Linux系统安装初始化及优化脚本
查看>>
2FSK:Error: Unexpected MATLAB expression.
查看>>
SpringMVC + MyBatis整合
查看>>
远程桌面的开启和故障处理
查看>>
我的友情链接
查看>>
Linux 下 /dev/zero 和 /dev/null
查看>>
quartz定时任务时间设置
查看>>
我的友情链接
查看>>
烂泥:不重启机器修改计算机名
查看>>
Linux安装Mysql及常用操作
查看>>
单机多实例安装mysql
查看>>
java 面试
查看>>
ES权威指南[官方文档学习笔记]-2
查看>>
Hadoop 2.5.1学习笔记7: 计数器的使用
查看>>
Netflix开源技术介绍[转]
查看>>
jquery 添加click事件
查看>>
我的友情链接
查看>>