awk功能很强大,慢慢学习使用吧mysql
下面使用均是学习视频总结整理出来的,每一个方式都包含了至少一个实例,因为视频讲解难以面面俱到,后续再查询资料补充!正则表达式
awk 数据统计,日志分析等 固定格式 awk 'pattern + { action }' file 好比: #假如a.log里面的内容以下 hello world ! my name is zjj 5 is iter 对于a.log内容,每一行内容都默认以空格为分割符,即上述文字能够被分为4列: 第一列 第二列 第三列 第四列 hello world ! my name is zjj 5 is iter 示例: #打印第一列($0表示全部列) awk '{print $1}' a.log 输出: hello my 5 #打印第二列和最后一列 awk '{print $2,$NF}' a.log 输出: world ! name zjj is iter #打印最后一列的前一列,对于a.log至关于第三列 awk '{print $(NF-1)}' a.log 输出: world iter
对于文本,record表示行,field表示列,因此在awk里面NR(Number of record), NF分别表示行数和列数 awk '{print NR,NF}' a.log 输出: 1 3 2 4 3 3 #1,2,3表示当前文本的行号;3,4,3则表示每行的总列数,符合a.log内容 #上述命令和下述命令的区别: awk '{print NR NF}' a.log 输出: 13 24 33 #将行号和列数拼接在了一块儿 #NR和NF之间的","表示二者分割,默认的分隔符是空格,因此每行的数字,好比1和3,以空格分割: 1 3 #NR和NF之间的空格则表示二者链接,因此每行的数字,好比1和3,是字符串的链接: 13 #好比下面命令,$1和制表符之间是空格,表示二者链接,同时再和$2链接 #换句话说,也就是用制表符替换了空格做为链接符,这样可使打印出来的信息各列对齐 awk '{print $1 "\t" $2}' a.log 输出: hello world my name
替换默认分隔符: #使用-F可替换默认的分隔符,好比-F:将使用:来替换默认的分隔符 #首先查看/etc/passwd awk '{print $0}' /etc/passwd | head -5 输出: 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 #以:分割且在第一列和最后一列之间用--链接,""是链接符 awk -F: '{print $1"--"$NF}' /etc/passwd | head -5 结果: root--/bin/bash bin--/sbin/nologin daemon--/sbin/nologin adm--/sbin/nologin lp--/sbin/nologin #awk默认使用空格做为输入分割符,若是要替换则使用FS 执行:awk 'BEGIN{FS=","}{print $1,$2}' 键盘输入: >aa,bb,cc 输出: >aa bb #此时的输入分隔符已经被替换成了",",那么aa,bb,cc至关于三列,而aa bb cc至关于1列,打印第1,2列 #awk默认使用","做为输出分割符,若是要替换则使用OFS awk 'BEGIN{OFS=","}{print $1,$2}' >aa bb cc >aa,bb #原本输出第1,2列应该是aa bb,二者之间使用空格分割,这里被替换成了"," #输入输出分隔符都替换 awk 'BEGIN{FS=",";OFS=","}{print $1,$2}' >aa,bb,cc >aa,bb BEGIN:语句设置计数和打印头部信息,在任何动做以前进行 END:语句输出统计结果,在任何动做以后 打印出passwd中用户UID大于1000的用户名和登录sehll >cat /etc/passwd | awk -F: '$3>1000{print $1 "\t" $3 "\t" $7}' 输出: nfsnobody 65534 /sbin/nologin mysql 1001 /bin/bash 打印出系统中能登录的普通用户 >cat /etc/passwd | awk -F: '$3>1000 && $7=="/bin/bash" {print $1 "\t" $3 "\t" $7}' 输出: mysql 1001 /bin/bash 打印输出信息是加上表头(BEGIN) >cat /etc/passwd | awk -F: 'BEGIN {print "NAME \t SHELL"} $3>1000 && $7=="/bin/bash" {print $1 "\t" $7}' 输出: NAME SHELL mysql /bin/bash 打印输出信息是加上尾头(END) >cat /etc/passwd | awk -F: '$3>1000 && $7=="/bin/bash" {print $1 "\t" $7}END {print "NAME \t SHELL"}' 输出: mysql /bin/bash NAME SHELL
#条件表达式 #注意字符串使用双引号,数字则不用 #匹配文本中第一列为"my"的行, 并输出全部列 awk '$1=="my"{print $0}' a.log 输出: my name is zjj #匹配数字 awk '$1==5{print $0}' a.log 输出: 5 is iter #使用awk '$1=="5"{print $0}' a.log也能匹配 #打出第二行 awk 'NR=2{print $0}' a.log #awk的内置函数能够赋值,这注意区分上面的格式,是否在{}内 #这里表示将第2列的值替换为xxxx,即隐藏输出 awk '{$2="xxxx"; print NR "\t" $0}' a.log 输出: 1 hello xxxx ! 2 my xxxx is zjj 3 5 xxxx iter #先输出行号,再拼接制表符,在输出全部的内容 命令格式: awk [-F | -f | -v] 'BEGIN{} // {command1;commonand2} END{}' file -F 指定分隔符 -f 调用脚本 -v 定义变量 '' 引用代码块 BEGIN 初始化代码块 // 匹配代码块,能够是字符串或者正则表达式 {} 命令代码块,包含一条或多条命令 ; 多条命令使用分隔符 END 命令结束代码块
结合正则 正则的模式写在//之间 只要包含abc便可匹配 1:/abc/ 实例: "abc" "xxabc" "xxabcxx" "xxab123cxx" --不匹配 执行:awk '/abc/{print $0}' 键盘依次输入上述实例,符合要求则被输出,不然输出空 下面的实例操做方式相同! a和c之间有一个字符便可 2:/a.c/ "aac" "a.c" "a c" "xxabcxxxx" #转义字符 3:/a\.c/ "/a.c/" /a\/c/ "/a/c/" 4:^ & ^之后面内容开头 &之后面内容结尾 必须以abc开头 /^abc/ "abc" "abcxxx" 必须以abc结尾 /abc$/ "abc" "xxxabc" 5:[] a和c之间只能匹配x,y,z,其余的都不行 /a[xyz]c/ "axc" "ayc" "azc" "agc" --不匹配 a和c之间必须匹配a到z之间的值(不能为空和大写字母) /a[a-z]c/ "aac" "ac" --不匹配 "aZc" --不匹配 /a[a-zA-Z]c/ "aac" "aZc" "Aaac" 若是^在[]之间,表示非的意思 表示a和c之间不能出现a-z中的值 /a[^a-z]c/ "aac" --不匹配 "aZc" 6:* + *前面的字符出现0次或屡次 +前面的字符出现1次或屡次 /a*b/ "b" "ab" "aaaab" "" /a+b/ "ab" "aaab" "b" --不匹配 7:? 出现或者不出现 a出现或者不出现 /a?b/ "b" "ab" 8:{} 出现的次数 #ab必须出现3次 /ab{3}c/ "abbbc" b出现3到4次 /ab{3,4}c/ "abbbc" "abbbbc" "abbbbbc" --不匹配 b出现3到10次 /ab{3,10}c/ b至少出现3次,且只能包含b /ab{3,}c/ 9:() 把一段东西看作一个总体 /(ab)+c/ "abc" "abababc" "abbc" --不匹配
awk做为编程语言 awk '{a=1;b=2; print a + b}' >回车输出3 awk '{a=1;b=2; print a b}' >回车输出12 awk '{a=1;b=2;c=5 print a b+c}' >回车输出15 >先计算b+c,获得5,再和1拼接获得15 数字和字符串一块儿计算时,只有数字在前面,awk才会把表达式做为数字运算 awk '{a=1;b="bbb";c=5 print b+c}' >获得5 awk '{a=1;b="33bbb";c=5 print b+c}' >获得38 awk '{a=1;b="bbb33";c=5 print b+c}' >获得5 其余的后续再整理!
其余实例: #将ifconfig中的实际ip替换,替换规则:将.替换为- #如:127.0.0.1 替换为 127-0-0-1 >ifconfig eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.94.129 netmask 255.255.255.0 broadcast 192.168.94.255 inet6 fe80::20c:29ff:feca:bc99 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:ca:bc:99 txqueuelen 1000 (Ethernet) RX packets 3561 bytes 346311 (338.1 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 1564 bytes 345525 (337.4 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 0 (Local Loopback) RX packets 4 bytes 340 (340.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 4 bytes 340 (340.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255 ether 00:00:00:00:00:00 txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 #获取指定行 >ifconfig | grep 'broadcast' | head -1 结果:inet 192.168.94.129 netmask 255.255.255.0 broadcast 192.168.94.255 #按照默认的空格分隔符提取第二列 >ifconfig | grep 'broadcast' | head -1 | awk '{print $2}' 结果:192.168.94.129 #对ip进行处理,以.为分割符,添加"-" >ifconfig | grep 'broadcast' | head -1 | awk '{print $2}' | awk -F. '{print $1"-"$2"-"$3"-"$4}' 结果:192-168-94-129 获取df里面use>40的信息 [zhuangjiajie@localhost home]$ df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 36G 13G 23G 37% / devtmpfs 1.9G 0 1.9G 0% /dev tmpfs 1.9G 84K 1.9G 1% /dev/shm tmpfs 1.9G 9.0M 1.9G 1% /run tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup /dev/sda1 297M 144M 154M 49% /boot tmpfs 378M 16K 378M 1% /run/user/42 tmpfs 378M 0 378M 0% /run/user/1000 >df -h | awk '/^\/dev/ {print $0}' | sed 's/%//g' | awk '$5 > 40 {print $1,$5"%"}' 解析:获取df信息,而后以"/dev/"匹配,打印出所有列,而后将%全局替换为空(去掉%才好进行大于小于的比较), 最后再以第五列大于40做为条件匹配,打印出第一和第五列,最后加上% 查询进程,杀掉以后重启脚本 ps -ef | grep apollo-portal | grep -v 'grep' | awk '{print $2}' | xargs kill -9 {} | xargs /wls/start.sh
后续再总结吧sql