printf("continue or not(Y/N)?");printf语句无法输入下一句,直接跳出

文本处理三剑客之AWK | Linux运维部落
AWK的基本格式:
&&&awk&[options]&'program'&file…&&&&&&
&&&注释:&
&&&program-&pattern{action&..}
&&&pattern和action:
&&&opattern部分决定动作语句何时触发及触发事件
(BEGIN,END)
&&&oaction&statements对数据进行处理,放在{}内指明
(print,&printf)
awk [options] 'program'&file…&&&&&&
program->pattern{action statements;..}
pattern和action:
opattern部分决定动作语句何时触发及触发事件(BEGIN,END)
oaction statements对数据进行处理,放在{}内指明(print, printf)
awk工作原理:
&&&&第一步:执行BEGIN{… }语句块中的语句
&&&&第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{… }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
&&&&第三步:当读至输入流末尾时,执行END{…}语句块
&&&&注意:pattern语句块中的通用命令是最重要的部分,也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块
&&&awk&[options]&'program'&file…&&&&&&
&&&program-&pattern{action&..}
&&&pattern和action:
&&&opattern部分决定动作语句何时触发及触发事件
(BEGIN,END)
&&&oaction&statements对数据进行处理,放在{}内指明
(print,&printf)
注意:awk程序通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块,共3部分组成。BEGIN语句块和END语句块分别为文家处理前和处理后执行的语句段
awk [options] 'program'&file…&&&&&&
program->pattern{action statements;..}
pattern和action:
opattern部分决定动作语句何时触发及触发事件(BEGIN,END)
oaction statements对数据进行处理,放在{}内指明(print, printf)注意:awk程序通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块,共3部分组成。BEGIN语句块和END语句块分别为文家处理前和处理后执行的语句段
1)OPTIONS
& 选项(options):
&&&&-F指明输入时用到的字段分隔符(默认以空格为分隔符)&&&&-v var内置变量|var=value: 自定义变量
&&&&变量分为内置变量和自定义变量:
●内置变量:
FS:输入字段分隔符,默认为空白字符(与-F效果相同)
[root@dashui&~]#&awk&-v&FS=&:&&'{print&$1,$3}'&/etc/passwd
[root@dashui ~]#&awk&-v&FS=&:&&'{print&$1,$3}'&/etc/passwdroot 0bin 1daemon 2
OFS:输出字段分隔符,默认为空白字符
[root@dashui&~]#&awk&-v&FS=&:&&-v&OFS=&*&&'{print&$1,$3}'&/etc/passwd
[root@dashui ~]#&awk&-v&FS=&:&&-v&OFS=&*&&'{print&$1,$3}'&/etc/passwdroot*0bin*1daemon*2
RS:输入记录分隔符,指定读入时的换行符,原换行符仍有效
[root@dashui&~]#&awk&-v&RS='&'&&'{print}'&hah&&&&//指定读入时的分割符,只要出现空格就被换行
[root@dashui&~]#&cat&hah&
nihao&a&haha
12345678910
[root@dashui ~]#&awk&-v&RS='&'&&'{print}'&hah&&&&//指定读入时的分割符,只要出现空格就被换行nihaoahahaiamfanin&[root@dashui ~]#&cat&hah&nihao a hahai amfanin
ORS:输出记录分隔符,输出时用指定符号代替换行符
[root@dashui&~]#&cat&hah&
nihao&a&haha
[root@dashui&~]#&awk&-v&ORS='===&'&&'{print}'&hah&&&&&//指定输出分隔符为===,所以原来换行被替换成===
nihao&a&haha===&i&amfanin===&[root@dashui&~]#
[root@dashui ~]#&cat&hah&nihao a hahai amfanin[root@dashui ~]#&awk&-v&ORS='===&'&&'{print}'&hah&&&&&//指定输出分隔符为===,所以原来换行被替换成===nihao a haha=== i amfanin=== [root@dashui ~]#
NF:字段数量
[root@dashui&~]#&awk&-F:&'{print&NF}'&/etc/passwd&&&&//以:为分隔符,每一行有几个字段
[root@dashui ~]#&awk&-F:&'{print&NF}'&/etc/passwd&&&&//以:为分隔符,每一行有几个字段777
NR:行号(如果有多个文件,则行号统计在一起)
[root@dashui&~]#&awk&'{print&NR}'&hah
[root@dashui&~]#&awk&'{print&NR}'&hah&/etc/fstab&&&&&&&//hah的行号和/etc/fstab的统计在了一块&&&
123456789101112131415161718
[root@dashui ~]#&awk&'{print&NR}'&hah12[root@dashui ~]#&awk&'{print&NR}'&hah&/etc/fstab&&&&&&&//hah的行号和/etc/fstab的统计在了一块&&&1234567891011121314
FNR:各文件分别计数,行号
[root@dashui&~]#&awk&'{print&FNR}'&hah&/etc/fstab&
123456789101112131415
[root@dashui ~]#&awk&'{print&FNR}'&hah&/etc/fstab&12123456789101112
FILENAME:当前文件名
[root@dashui&~]#&awk&'{print&FILENAME}'&hah&//因为前面的pattern没有写,所以默认每读入一行,就执行一次print
[root@dashui&~]#&cat&hah&
nihao&a&haha
[root@dashui ~]#&awk&'{print&FILENAME}'&hah&//因为前面的pattern没有写,所以默认每读入一行,就执行一次printhahhah[root@dashui ~]#&cat&hah&nihao a hahai amfanin
ARGC:命令行参数的个数
[root@dashui&~]#&awk&'{print&ARGC}'&hah&&&&&//其中第一个参数为awk&,第二个为&hah
[root@dashui ~]#&awk&'{print&ARGC}'&hah&&&&&//其中第一个参数为awk&,第二个为&hah22
ARGV:数组,保存的是命令行所给定的各参数
[root@dashui&~]#&awk&'{print&ARGV[0]}'&hah&&&&&//0是第一个参数,1是第二个参数
[root@dashui&~]#&awk&'{print&ARGV[1]}'&hah&
[root@dashui ~]#&awk&'{print&ARGV[0]}'&hah&&&&&//0是第一个参数,1是第二个参数awkawk[root@dashui ~]#&awk&'{print&ARGV[1]}'&hah&hahhah
●自定义变量& (1) -v var=value&&&&变量名区分字符大小写& (2) 在program中直接定义
[root@dashui&~]#&awk&-v&name=xiaoshui&'BEGIN{print&name}'
[root@dashui&~]#&awk&'BEGIN{name=&xiaozhao&;print&name}'
[root@dashui ~]#&awk&-v&name=xiaoshui&'BEGIN{print&name}'xiaoshui[root@dashui ~]#&awk&'BEGIN{name=&xiaozhao&;print&name}'xiaozhao
&&&&注意:自定义变量时需要加上双引号,不加的话可能会定义不成功,如下
[root@dashui&~]#&awk&'BEGIN{name=print&name}'
[root@dashui&~]#&awk&'BEGIN{name=&xiaozhao&;print&name}'
[root@dashui ~]#&awk&'BEGIN{name=print&name}'&[root@dashui ~]#&awk&'BEGIN{name=&xiaozhao&;print&name}'xiaozhao
2)program
&&&&program分为pattern和action
&&opattern部分决定动作语句何时触发及触发事件
(BEGIN,END)
&&&oaction&statements对数据进行处理,放在{}内指明
(print,&printf)
opattern部分决定动作语句何时触发及触发事件(BEGIN,END)
oaction statements对数据进行处理,放在{}内指明(print, printf)
(1)action(print、printf)
oExpressions:算术,比较表达式等oControl statements:if, while等oCompound statements:组合语句oinput statementsooutput statements:print等
&&&&print &&
print格式:print item1, item2, …
&&&&o(1) 逗号分隔符&&&&o(2) 输出的各item可以字符串,也可以是数值;当前记录的字段、变量或awk的表达式&&&&o(3) 如省略item,相当于print $0
[root@dashui&~]#&awk&-F&:&'{print&$1,$3}'&/etc/passwd
[root@dashui&~]#&awk&-F&:&'{print&$1,&xiaoshui&,$3}'&/etc/passwd
root&xiaoshui&0
bin&xiaoshui&1
daemon&xiaoshui&2
[root@dashui&~]#&awk&-F&:&'{print&}'&/etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
123456789101112
[root@dashui ~]#&awk&-F&:&'{print&$1,$3}'&/etc/passwdroot 0bin 1daemon 2[root@dashui ~]#&awk&-F&:&'{print&$1,&xiaoshui&,$3}'&/etc/passwdroot xiaoshui 0bin xiaoshui 1daemon xiaoshui 2[root@dashui ~]#&awk&-F&:&'{print&}'&/etc/passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologin
&&&&printf
格式化输出:printf“FORMAT”, item1, item2, …&&&&(1) 必须指定FORMAT&&&&(2) 不会自动换行,需要显式给出换行控制符,\n&&&&(3) FORMAT中需要分别为后面每个item指定格式符
格式符:与item一一对应
&&&&%c: 显示字符的ASCII码&&&&%d, %i: 显示十进制整数&&&&%e, %E:显示科学计数法数值&&&&%f:显示为浮点数&&&&%g, %G:以科学计数法或浮点形式显示数值&&&&%s:显示字符串&&&&%u:无符号整数&&&&%%: 显示%自身
&&&&#[.#]:第一个数字控制显示的宽度;第二个#表示小数点后精度,%3.1f&&&&-: 左对齐(默认右对齐)%-15s&&&&+:显示数值的正负符号%+d
[root@dashui&~]#&awk&-F&:&'{printf&&%s&%d\n&,$1,$3&}'&/etc/passwd&&&&//如果不加\n默认是不换行的
[root@dashui ~]#&awk&-F&:&'{printf&&%s&%d\n&,$1,$3&}'&/etc/passwd&&&&//如果不加\n默认是不换行的root 0bin 1daemon 2
(2)pattern
PATTERN:根据pattern条件,过滤匹配的行,再做处理
&&&&(1)如果未指定:空模式,匹配每一行&&&&(2) /regular expression/:仅处理能够模式匹配到的行,需要用/ /括起来
[root@dashui&~]#&awk&'/^UUID/{print&$1}'&/etc/fstab&//&以UUID开头的行
UUID=136f7cbb-d8f6-439b-aa73-f
UUID=bf3d4b2f--8d70-a
UUID=cbf33183-93bf-4b4f-81c0-ea6ae91cd4f6
UUID=5e11b173-f7e2--55cc4c41f20b
[root@dashui ~]#&awk&'/^UUID/{print&$1}'&/etc/fstab&//&以UUID开头的行UUID=136f7cbb-d8f6-439b-aa73-fUUID=bf3d4b2f-4629-4fd7-8d70-aUUID=cbf33183-93bf-4b4f-81c0-ea6ae91cd4f6UUID=5e11b173-f7e2-4994-95b9-55cc4c41f20b
&&&&(3) relational expression: 关系表达式,结果有“真”有“假”,结果为“真”才会被处理&&&&& 真:结果为非0值,非空字符串&&&&& 假:结果为空字符串或0值
[root@dashui&~]#&awk&'0{print&$0}'&hah&&&&//因为前面为0,所以不执行
[root@dashui&~]#&awk&'!0{print&$0}'&hah&&&&//与上面相反
nihao&a&haha
[root@dashui&~]#&awk&-F:&'$3==0{print&$0}'&/etc/passwd&&&&//只有当$3=0时候,才会执行print
root:x:0:0:root:/root:/bin/bash
[root@dashui ~]#&awk&'0{print&$0}'&hah&&&&//因为前面为0,所以不执行[root@dashui ~]#&awk&'!0{print&$0}'&hah&&&&//与上面相反nihao a hahai amfanin[root@dashui ~]#&awk&-F:&'$3==0{print&$0}'&/etc/passwd&&&&//只有当$3=0时候,才会执行printroot:x:0:0:root:/root:/bin/bash
&&&&(4) line ranges:行范围
startline,endline:/pat1/,/pat2/不支持直接给出数字格式
[root@dashui&~]#&awk&-F:&'/^root\&/,/^daemon\&/{print}'&/etc/passwd&&&&//打印以root开头与以daemon开头的之间的行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@dashui&~]#
[root@dashui ~]#&awk&-F:&'/^root\&/,/^daemon\&/{print}'&/etc/passwd&&&&//打印以root开头与以daemon开头的之间的行root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologin[root@dashui ~]#
&&&&(5)(5) BEGIN/END模式BEGIN{}: 仅在开始处理文件中的文本之前执行一次END{}:仅在文本处理完成之后执行一次
[root@dashui&~]#&awk&'BEGIN{print&&start&}{print&$0}END{print&&end&}'&hah&&&&//在开始和结束时候分别打印start和end
nihao&a&haha
[root@dashui&~]#&cat&hah
nihao&a&haha
[root@dashui ~]#&awk&'BEGIN{print&&start&}{print&$0}END{print&&end&}'&hah&&&&//在开始和结束时候分别打印start和endstartnihao a hahai amfaninend[root@dashui ~]#&cat&hahnihao a hahai amfanin
AWK的操作符
算术操作符:&&&&x+y, x-y, x*y, x/y, x^y, x%y&&&&-x: 转换为负数&&&&+x: 转换为数值
[root@dashui&~]#&awk&'BEGIN{i=1;j=2;sum=i+j;{print&sum}}'&&&&
[root@dashui ~]#&awk&'BEGIN{i=1;j=2;sum=i+j;{print&sum}}'&&&&3
字符串操作符:没有符号的操作符,字符串连接赋值操作符:&&&&=, +=, -=, *=, /=, %=, ^=&&&&++, —比较操作符:&&&&&, &=, &, &=, !=, ==模式匹配符:&&&&~:左边是否和右边匹配包含&&&&&&&&!~:是否不匹配
[root@dashui&~]#&awk&-F:&'$1~&root&{print&$0}'&/etc/passwd&&&&//当$1即usrename为root或者包含&root时候,执行print
root:x:0:0:root:/root:/bin/bash
chroot:x::,:/home/chroot:/bin/bash
rooter:x::,:/home/rooter:/bin/bash
[root@dashui&~]#&awk&-F:&'$3&2{print&$0}'&/etc/passwd&&&&//$3即uid小于2时,执行print
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@dashui ~]#&awk&-F:&'$1~&root&{print&$0}'&/etc/passwd&&&&//当$1即usrename为root或者包含&root时候,执行printroot:x:0:0:root:/root:/bin/bashchroot:x:1003:1003:,:/home/chroot:/bin/bashrooter:x:3320:4327:,:/home/rooter:/bin/bash[root@dashui ~]#&awk&-F:&'$3&2{print&$0}'&/etc/passwd&&&&//$3即uid小于2时,执行printroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologin
逻辑操作符:与&&,或||,非!
[root@dashui&~]#&awk&-F:&'$3&1000&&&&$3&2000{print&$0}'&/etc/passwd
xiaoshui:x::xiaoshui,:/home/xiaoshui:/bin/bash
chroot:x::,:/home/chroot:/bin/bash
centos:x::,:/home/centos:/bin/bash
[root@dashui&~]#&awk&-F:&'$1==&root&&||&$1==&xiaoshui&{print&$0}'&/etc/passwd
root:x:0:0:root:/root:/bin/bash
xiaoshui:x::xiaoshui,:/home/xiaoshui:/bin/bash
[root@dashui ~]#&awk&-F:&'$3&1000&&&&$3&2000{print&$0}'&/etc/passwdxiaoshui:x:1001:1001:xiaoshui,:/home/xiaoshui:/bin/bashchroot:x:1003:1003:,:/home/chroot:/bin/bashcentos:x:1004:1004:,:/home/centos:/bin/bash[root@dashui ~]#&awk&-F:&'$1==&root&&||&$1==&xiaoshui&{print&$0}'&/etc/passwdroot:x:0:0:root:/root:/bin/bashxiaoshui:x:1001:1001:xiaoshui,:/home/xiaoshui:/bin/bash
awk控制语句
●{… } 组合语句●if(condition) {…}●if(condition) {…} else {…}●while(conditon) {…}●do {…} while(condition)●for(expr1;expr2;expr3) {…}●break●continue●delete array[index]●delete array●exit
(1){… } 组合语句
[root@dashui&~]#&awk&'{a=1;print&a}'&hah&&&&//将多个语句组合在一起
[root@dashui ~]#&awk&'{a=1;print&a}'&hah&&&&//将多个语句组合在一起11
(2)●if(condition) {…}
[root@dashui&~]#&awk&-F:&'{if($3==0){print&$0}}'&/etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@dashui ~]#&awk&-F:&'{if($3==0){print&$0}}'&/etc/passwdroot:x:0:0:root:/root:/bin/bash
&&&&注意:条件在小括号中,条件后的语句需在{ }中
(3)●if(condition) {…} else {…}
&&&& && ● if(condition1){statement1}else if(condition2){statement2}else{statement3}
[root@dashui&~]#&awk&'{if($0==&dashui&){print&&dashui&}&else{print&&not&dashui&}}'&hah
not&dashui
not&dashui
[root@dashui&~]#&cat&hah
nihao&a&haha
[root@dashui ~]#&awk&'{if($0==&dashui&){print&&dashui&}&else{print&&not&dashui&}}'&hahnot dashuinot dashuidashui[root@dashui ~]#&cat&hahnihao a hahai amfanindashui
(4)●while(conditon) {…}
//下面是找到以空格开头后跟linux16的行,将匹配到的行中的每个字段的长度与8比较,大于8的输出
[root@dashui&~]#&awk&'/^[[:space:]]+linux16/{i=1;while(i&=NF){if(length($i)&8){print&$i,length($i)};i++}}'&/etc/grub2.cfg&
/vmlinuz-3.10.0-327.el7.x86_64&30
root=UUID=136f7cbb-d8f6-439b-aa73-f&46
net.ifnames=0&13
/vmlinuz-0-rescue-3f3be6c44df91efd2f2c5ab&50
root=UUID=136f7cbb-d8f6-439b-aa73-f&46
net.ifnames=0&13
//下面是找到以空格开头后跟linux16的行,将匹配到的行中的每个字段的长度与8比较,大于8的输出[root@dashui ~]#&awk&'/^[[:space:]]+linux16/{i=1;while(i&=NF){if(length($i)&8){print&$i,length($i)};i++}}'&/etc/grub2.cfg&/vmlinuz-3.10.0-327.el7.x86_64 30root=UUID=136f7cbb-d8f6-439b-aa73-f 46net.ifnames=0 13/vmlinuz-0-rescue-3f3be6c44df91efd2f2c5ab 50root=UUID=136f7cbb-d8f6-439b-aa73-f 46net.ifnames=0 13
&&&&做上面的实验时,因为手抖输出了点,将if后面的print中i前面的$符号给忘记了,结果就成了下面的情况
[root@dashui&~]#&awk&'/^[[:space:]]+linux16/{i=1;while(i&=NF){if(length($i)&8){print&i,length(i)};i++}}'&/etc/grub2.cfg&
//分析:print&i,因为前面i赋值的是数字,本意是想打印$i,即各个字段,当$符号丢掉时,i也只是代表数字了
所以打印出来的237237表示的就是第几个字段,而length(i)就更好理解了,因为length()就是求括号中的
字符串的长度,且因为i都为个位数,所以就为1喽(注意:如果单单是length(i),i之前没有被定义,此时打印出来
的为0,以为i之前没有被定义,所以为空)
1234567891011
[root@dashui ~]#&awk&'/^[[:space:]]+linux16/{i=1;while(i&=NF){if(length($i)&8){print&i,length(i)};i++}}'&/etc/grub2.cfg&2 13 17 12 13 17 1//分析:print&i,因为前面i赋值的是数字,本意是想打印$i,即各个字段,当$符号丢掉时,i也只是代表数字了所以打印出来的237237表示的就是第几个字段,而length(i)就更好理解了,因为length()就是求括号中的字符串的长度,且因为i都为个位数,所以就为1喽(注意:如果单单是length(i),i之前没有被定义,此时打印出来的为0,以为i之前没有被定义,所以为空)
(5)do-while循环
语法:do {…}while(condition)意义:无论真假,至少执行一次循环体
[root@dashui&~]#&awk&'BEGIN{i=0;do{i++}while(i&1){print&i}}'
[root@dashui&~]#&awk&'BEGIN{i=0;do{i++}while(i&=1){print&i}}'
[root@dashui ~]#&awk&'BEGIN{i=0;do{i++}while(i&1){print&i}}'1[root@dashui ~]#&awk&'BEGIN{i=0;do{i++}while(i&=1){print&i}}'2
(6)for循环
语法:for(expr1;expr2;expr3) {…}
[root@dashui&~]#&awk&'/^[[:space:]]+linux16/{for(i=1;i&NF;i++){print&$i}}'&/etc/grub2.cfg&
/vmlinuz-3.10.0-327.el7.x86_64
root=UUID=136f7cbb-d8f6-439b-aa73-f
/vmlinuz-0-rescue-3f3be6c44df91efd2f2c5ab
root=UUID=136f7cbb-d8f6-439b-aa73-f
12345678910111213
[root@dashui ~]#&awk&'/^[[:space:]]+linux16/{for(i=1;i&NF;i++){print&$i}}'&/etc/grub2.cfg&linux16/vmlinuz-3.10.0-327.el7.x86_64root=UUID=136f7cbb-d8f6-439b-aa73-frorhgbquietlinux16/vmlinuz-0-rescue-3f3be6c44df91efd2f2c5abroot=UUID=136f7cbb-d8f6-439b-aa73-frorhgbquiet
特殊用法:能够遍历数组中的元素;语法:for(varin array) {for-body}
[root@dashui&~]#&awk&-F:&'{bash[$7]++}END{for&(i&in&bash){print&i,bash[i]}}'&/etc/passwd
/etc/nologin&2
/bin/sync&1
/bin/bash&47
/shell/csh&1
/sbin/nologin&34
/sbin/halt&1
/bin/csh&2
/sbin/shutdown&1
[root@dashui&~]#
12345678910
[root@dashui ~]#&awk&-F:&'{bash[$7]++}END{for&(i&in&bash){print&i,bash[i]}}'&/etc/passwd/etc/nologin 2/bin/sync 1/bin/bash 47/shell/csh 1/sbin/nologin 34/sbin/halt 1/bin/csh 2/sbin/shutdown 1[root@dashui ~]#
(7)switch语句
语法:switch(expression) {case VALUE1 or /REGEXP/: case VALUE2 or /REGEXP2/: …; default: statement}
(8)break和continue
&&&&break表示跳出循环,而continue表示跳过本轮循环
[root@dashui&~]#&awk&'BEGIN{sum=0;for(i=1;i&10;i++){if(i==5){break}print&i}}'
[root@dashui&~]#&awk&'BEGIN{sum=0;for(i=1;i&10;i++){if(i==5){continue}print&i}}'
1234567891011121314
[root@dashui ~]#&awk&'BEGIN{sum=0;for(i=1;i&10;i++){if(i==5){break}print&i}}'1234[root@dashui ~]#&awk&'BEGIN{sum=0;for(i=1;i&10;i++){if(i==5){continue}print&i}}'12346789
&&&&提前结束对本行处理而直接进入下一行处理(awk自身循环)
#$3%2!=0即uid为奇数,跳过此行,即只打印uid为偶束的行
[root@dashui&~]#&awk&-F:&'{if($3%2!=0)&&print&$1,$3}'&/etc/passwd
shutdown&6
#$3%2!=0即uid为奇数,跳过此行,即只打印uid为偶束的行[root@dashui ~]#&awk&-F:&'{if($3%2!=0)&&print&$1,$3}'&/etc/passwdroot 0daemon 2lp 4shutdown 6mail 8games 12
&&&&关联数组:array[index-expression]
index-expression:
o(1) 可使用任意字符串;字符串要使用双引号括起来o(2) 如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为“空串”o若要判断数组中是否存在某元素,要使用“index in array”格式进行遍历
#注意:如果数组的键值为字符串时,最后以双引号给引起来
[root@dashui&~]#&awk&'BEGIN{weekdays[&mon&]=&Monday&;weekdays[&tue&]=&Tuesday&;print&weekdays[&mon&]}'
#注意:如果数组的键值为字符串时,最后以双引号给引起来[root@dashui ~]#&awk&'BEGIN{weekdays[&mon&]=&Monday&;weekdays[&tue&]=&Tuesday&;print&weekdays[&mon&]}'Monday
若要遍历数组中的每个元素,要使用for循环
[root@dashui&~]#&netstat&-tan|awk&'/^tcp\&/{state[$NF]++}END{for(i&in&state){print&i,state[i]}}'
ESTABLISHED&1
[root@dashui ~]#&netstat&-tan|awk&'/^tcp\&/{state[$NF]++}END{for(i&in&state){print&i,state[i]}}'LISTEN 3ESTABLISHED 1
●数值处理:rand():返回0和1之间一个随机数
#注意:需配合srand()函数使用,不然不是随机数
[root@dashui&~]#&awk&'BEGIN{srand();&for&(i=1;i&=10;i++)print&int(rand()*100)}'
123456789101112
#注意:需配合srand()函数使用,不然不是随机数[root@dashui ~]#&awk&'BEGIN{srand();&for&(i=1;i&=10;i++)print&int(rand()*100)}'54452324147256923131
●字符串处理:
olength([s]):返回指定字符串的长度
osub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并将第一个匹配的内容替换为s
ogsub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并全部替换为s所表示的内容
[root@dashui&~]#&echo&&&08:08:08&|awk&'sub(&:&,&-&,$0)'
[root@dashui&~]#&echo&&&08:08:08&|awk&'gsub(&:&,&-&,$0)'
[root@dashui&~]#
[root@dashui ~]#&echo&&&08:08:08&|awk&'sub(&:&,&-&,$0)'2008-08:08 08:08:08[root@dashui ~]#&echo&&&08:08:08&|awk&'gsub(&:&,&-&,$0)'2008-08-08 08-08-08[root@dashui ~]#
osplit(s,array,[r]):以r为分隔符,切割字符s,并将切割后的结果保存至array所表示的数组中,第一个索引值为1,第二个索引值为2,…
#这里使用split函数将第五个字段中的ip和端口号分开,只取出了ip。
[root@dashui&~]#&netstat&-tan&|&awk&'/^tcp\&/{split($5,ip,&:&);count[ip[1]]++}END{for&(i&in&count)&{print&i,count[i]}}'
10.1.0.82&1
[root@dashui&~]#&netstat&-tan&
Active&Internet&connections&(servers&and&established)
Proto&Recv-Q&Send-Q&Local&Address&&&&&&&&&&&Foreign&Address&&&&&&&&&State&&&&&&
tcp&&&&&&&&0&&&&&&0&0.0.0.0:22&&&&&&&&&&&&&&0.0.0.0:*&&&&&&&&&&&&&&&LISTEN&&&&&
tcp&&&&&&&&0&&&&&&0&127.0.0.1:631&&&&&&&&&&&0.0.0.0:*&&&&&&&&&&&&&&&LISTEN&&&&&
tcp&&&&&&&&0&&&&&&0&127.0.0.1:25&&&&&&&&&&&&0.0.0.0:*&&&&&&&&&&&&&&&LISTEN&&&&&
tcp&&&&&&&&0&&&&&52&10.1.0.26:22&&&&&&&&&&&&10.1.0.82:54143&&&&&&&&&ESTABLISHED
tcp6&&&&&&&0&&&&&&0&:::22&&&&&&&&&&&&&&&&&&&:::*&&&&&&&&&&&&&&&&&&&&LISTEN&&&&&
tcp6&&&&&&&0&&&&&&0&::1:631&&&&&&&&&&&&&&&&&:::*&&&&&&&&&&&&&&&&&&&&LISTEN&&&&&
tcp6&&&&&&&0&&&&&&0&::1:25&&&&&&&&&&&&&&&&&&:::*&&&&&&&&&&&&&&&&&&&&LISTEN&&&&&
[root@dashui&~]#
123456789101112131415
#这里使用split函数将第五个字段中的ip和端口号分开,只取出了ip。[root@dashui ~]#&netstat&-tan&|&awk&'/^tcp\&/{split($5,ip,&:&);count[ip[1]]++}END{for&(i&in&count)&{print&i,count[i]}}'10.1.0.82 10.0.0.0 3[root@dashui ~]#&netstat&-tan&Active Internet connections (servers and established)Proto Recv-Q Send-Q Local Address
Foreign Address
0 0.0.0.0:22
0 127.0.0.1:631
0 127.0.0.1:25
52 10.1.0.26:22
10.1.0.82:54143
ESTABLISHEDtcp6
[root@dashui ~]#
o自定义函数
格式:&&&&function name ( parameter, parameter, … ) {&&&&statements&&&&return expression
#这里自定义了一个函数,求出两个变量的最大值。
[root@dashui&~]#&awk&-f&awk.fun&
[root@dashui&~]#&cat&awk.fun&
function&max(v1,v2)&{
v1&v2?var=v1:var=v2
return&var
BEGIN{a=3;b=2;print&max(a,b)}
#这里自定义了一个函数,求出两个变量的最大值。[root@dashui ~]#&awk&-f&awk.fun&3[root@dashui ~]#&cat&awk.fun&function max(v1,v2) {v1>v2?var=v1:var=v2return var}BEGIN{a=3;b=2;print max(a,b)}
&&&&注意:和之前的shell中的函数有些不同,这里如果需要像awk函数中传递变量,则需要在括号中定义形参。
awk中调用shell命令
system命令
[root@dashui&~]#&awk&BEGIN'{system(&hostname&)}'
dashui.localdomain
[root@dashui ~]#&awk&BEGIN'{system(&hostname&)}'dashui.localdomain
空格是awk中的字符串连接符,如果system中需要使用awk中的变量可以使用空格分隔,或者说除了awk的变量外其他一律用&&引用起来。
[root@dashui&~]#&awk&'BEGIN{name=&xiaoshui&;system(&echo&your&name&is&&&name)}'
your&name&is&xiaoshui
[root@dashui ~]#&awk&'BEGIN{name=&xiaoshui&;system(&echo&your&name&is&&&name)}'your name is xiaoshui
将awk程序写成脚本,直接调用或执行
#将action写入到脚本中,然后调用执行
[root@dashui&~]#&awk&-F:&-f&f1.awk&/etc/passwd
[root@dashui&~]#&cat&f1.awk&
{if($3&4)print&$1,$3}
#&&脚本文件中的/bin/awk&-f表示是用awk&-f来执行下面语句
[root@dashui&~]#&./f1.awk&-F:&/etc/passwd
[root@dashui&~]#&cat&f1.awk&
#!/bin/awk&-f
#this&is&a&awk&script
{if($3&4)print&$1,$3}
1234567891011121314151617181920
#将action写入到脚本中,然后调用执行[root@dashui ~]#&awk&-F:&-f&f1.awk&/etc/passwdroot 0bin 1daemon 2adm 3hu [root@dashui ~]#&cat&f1.awk&{if($3<4)print $1,$3}#&&脚本文件中的/bin/awk&-f表示是用awk&-f来执行下面语句[root@dashui ~]#&./f1.awk&-F:&/etc/passwdroot 0bin 1daemon 2adm 3hu [root@dashui ~]#&cat&f1.awk&#!/bin/awk&-f#this&is&a&awk&script{if($3<4)print $1,$3}
向awk脚本传递参数
&格式:&&&&awkfile var=value var2=value2… Inputfile
#&min和max分别对应脚本文件中的min和max
[root@dashui&~]#&./f1.awk&-F:&min=100&max=200&/etc/passwd
avahi-autoipd&170
usbmuxd&113
[root@dashui&~]#&cat&f1.awk&
#!/bin/awk&-f
{if($3&=min&&&&$3&=max)print&$1,$3}
12345678910
#&min和max分别对应脚本文件中的min和max[root@dashui ~]#&./f1.awk&-F:&min=100&max=200&/etc/passwdavahi-autoipd 170abrt 173rtkit 172usbmuxd 113pulse 171[root@dashui ~]#&cat&f1.awk&#!/bin/awk&-f{if($3>=min && $3<=max)print $1,$3}
1.打印一个表头,并且打印用户名和ID
[root@dashui&~]#&awk&-F:&'BEGIN{printf&&Username&&&&&&&&&&&UID\n&}{printf&&%-20s&%d\n&,$1,$3}'&/etc/passwd
Username&&&&&&&&&&&UID
root&&&&&&&&&&&&&&&&&0
bin&&&&&&&&&&&&&&&&&&1
daemon&&&&&&&&&&&&&&&2
adm&&&&&&&&&&&&&&&&&&3
lp&&&&&&&&&&&&&&&&&&&4
sync&&&&&&&&&&&&&&&&&5
shutdown&&&&&&&&&&&&&6
halt&&&&&&&&&&&&&&&&&7
mail&&&&&&&&&&&&&&&&&8
operator&&&&&&&&&&&&&11
games&&&&&&&&&&&&&&&&12
12345678910111213
[root@dashui ~]#&awk&-F:&'BEGIN{printf&&Username&&&&&&&&&&&UID\n&}{printf&&%-20s&%d\n&,$1,$3}'&/etc/passwdUsername
2.打印一个表头和表尾,并打印用户名,ID,及shell
[root@dashui&~]#&awk&-F:&'BEGIN{printf&&Username&&&&&&&&&&&UID&&&&&Shell\n&}{printf&&%-20s&%d&%10s\n&,$1,$3,$5}END{print&&Finished...&}'&/etc/passwd
Username&&&&&&&&&&&UID&&&&&Shell
root&&&&&&&&&&&&&&&&&0&&&&&&&root
bin&&&&&&&&&&&&&&&&&&1&&&&&&&&bin
daemon&&&&&&&&&&&&&&&2&&&&&daemon
adm&&&&&&&&&&&&&&&&&&3&&&&&&&&adm
lp&&&&&&&&&&&&&&&&&&&4&&&&&&&&&lp
sync&&&&&&&&&&&&&&&&&5&&&&&&&sync
shutdown&&&&&&&&&&&&&6&&&shutdown
...省略...
haha&&&&&&&&&&&&&&&&&4376&&&&&&&&&&&
xixi&&&&&&&&&&&&&&&&&4377&&&&&&&&&&&
hehe&&&&&&&&&&&&&&&&&4378&&&&&&&&&&&
Finished...
[root@dashui&~]#
12345678910111213141516
[root@dashui ~]#&awk&-F:&'BEGIN{printf&&Username&&&&&&&&&&&UID&&&&&Shell\n&}{printf&&%-20s&%d&%10s\n&,$1,$3,$5}END{print&&Finished...&}'&/etc/passwd&Username
syncshutdown
shutdown...省略...haha
Finished...[root@dashui ~]#
3.对文本中的字段进行字符个数统计
[root@dashui&~]#&awk&'{print&$0,length($0)}'&hah
nihao&a&haha&12
i&amfanin&9
[root@dashui ~]#&awk&'{print&$0,length($0)}'&hahnihao a haha 12i amfanin 9dashui 6
4.打印字符个数大于等于8的字段
#其实就是比题3多了一条if判断语句
[root@dashui&~]#&awk&'{if(length($0)&8){print&$0,length($0)}}'&hah
nihao&a&haha&12
i&amfanin&9
#其实就是比题3多了一条if判断语句[root@dashui ~]#&awk&'{if(length($0)&8){print&$0,length($0)}}'&hahnihao a haha 12i amfanin 9
5.统计系统中shell的类型,并打印shell引用的次数
#中间运用了数组和for循环
[root@dashui&~]#&awk&-F:&'{count[$7]++}END{for&(i&in&count){print&i,count[i]}}'&/etc/passwd
/etc/nologin&2
/bin/sync&1
/bin/bash&47
/shell/csh&1
/sbin/nologin&34
/sbin/halt&1
/bin/csh&2
/sbin/shutdown&1
12345678910
#中间运用了数组和for循环[root@dashui ~]#&awk&-F:&'{count[$7]++}END{for&(i&in&count){print&i,count[i]}}'&/etc/passwd/etc/nologin 2/bin/sync 1/bin/bash 47/shell/csh 1/sbin/nologin 34/sbin/halt 1/bin/csh 2/sbin/shutdown 1
6.统计fstab文件中,各文件系统被引用的次数
#比上题多了一步地址定界
[root@dashui&~]#&awk&'/^[^#]/{count[$3]++}END{for&(i&in&count){print&i,count[i]}}'&/etc/fstab&
#比上题多了一步地址定界[root@dashui ~]#&awk&'/^[^#]/{count[$3]++}END{for&(i&in&count){print&i,count[i]}}'&/etc/fstab&swap 1xfs 3
7.统计系统中各TCP连接状态的数量
[root@dashui&~]#&netstat&-tan|awk&'/^tcp\&/{state[$6]++}END{for&(i&in&state){print&i,state[i]}}'
ESTABLISHED&1
[root@dashui ~]#&netstat&-tan|awk&'/^tcp\&/{state[$6]++}END{for&(i&in&state){print&i,state[i]}}'LISTEN 3ESTABLISHED 1
8.将文本的重复行去掉
#第一次读取aaa,arr[aaa]因为没有定义,所以为空,又取非,所以为真,arr[aaa]++是先赋值后加加,所以第一次打印出来
#第二次,在遇见aaa时候,因为之前有值了arr[aaa]=1,所以取反为0,不执行后的print操作,但是++依然正常运行
[root@dashui&~]#&awk&'!arr[$0]++'&hah
[root@dashui&~]#&cat&hah&
[root@dashui&~]#
123456789101112131415161718192021
#第一次读取aaa,arr[aaa]因为没有定义,所以为空,又取非,所以为真,arr[aaa]++是先赋值后加加,所以第一次打印出来#第二次,在遇见aaa时候,因为之前有值了arr[aaa]=1,所以取反为0,不执行后的print操作,但是++依然正常运行[root@dashui ~]#&awk&'!arr[$0]++'&hahaaabbbcccdddfff&[root@dashui ~]#&cat&hah&aaabbbcccaaadddaaaaaafffccc&[root@dashui ~]#
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 谢谢浏览,以后会不定时更新…
您还未登录,请登录后再进行相关操作!
400-080-6560
在线咨询:
工作时间:周一至周五,9:30-18:30,节假日同时也值班

我要回帖

更多关于 Y字母 的文章

 

随机推荐