Shell awk
1.awk流逝编辑器,支持分段,列的处理。
Awk参数
-F‘:’ #分割字符,不加默认按空格。 {print NR} #显示行号。 ==,>,<,=>,<=, #等于。大于,小雨,大于等于,大于小于。 = #更改值。 $NF #等于段。 $NR #等于行。
Awk语句
(1)awk –F‘:’ ‘{print $1}’ 文件名 #分割:字符$表示第几个。 (2)awk ‘/root/’文件名 #匹配关键字。 (3)awk –F‘:’ ‘/root/ {print $1,$3}’ #查找/root/行的:的第一段第三段。 (4)awk –F‘:’ ‘/$1==root {print $1,$3}’ #输出$1等于root的行并输出$1,$3。 (5)awk –F ‘:’ ‘$3>=500’passwd #$3大于等于500的都列出来。 (6)awk –F ‘:’ ‘$7!=“/sbin/nologin”’ passwd #$7不等于nologin的列出来。 (7)awk –F ‘:’ ‘$3==$4 && $7!=“/bin/bash”’ #$3等于$4并且$7不是/bin/bash。 (8)awk –F ‘:’ ‘$NR>20 && $NF!=“/bin/bash”’ #20行内的,每一个段中,打印出不等于/bin/bash的行。 (9)awk –F ‘:’ ‘$7=$3+$4’ passwd #相加得出$7的结果。不打印冒号。 (10)awk –F ‘:’ ‘{(tot=tot+$3)}; END {print tot}’ #得出tot的值。 (11)awk –F ‘:’ ‘{if ($1==“root”) print}’ #得出$1等于root参数的行。
(12)awk -v RS='\0' -F'-' '{print NF-1}' #查找指定字符串“-”的次数
2.理解语句awk –F‘:’‘{print $0}’与awk –F‘:’‘$1=1{print $0}’区别。
(1)awk –F‘:’‘{print $0}’ #显示所有行列,显示:。 (2)awk –F‘:’‘$1=1{print $0} #显示所有行列,更改值后,不显示:。
新增拓展2
# 默认空格符分隔 print输出。 awk '{print $1}' # 使用-F指定切割符,\t TAB 距离 awk -F ':' '{print $1"\t"$7}' # BEGIN 输出开头字符,END 输出结尾字符 awk -F':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "blue,/bin/nosh"}' # 查找":"分隔的包含root开头的字符串的行。 awk -F':' '/^root/' # 查找已root存在的行的$7字符 awk -F":" '/root/{print $7}' /etc/passwd
# awk 内置变量 ARGC:命令行参数个数 ARGV:命令行参数排列 ENVIRON:支持队列中系统环境变量的使用 FILENAME:awk浏览的文件名 FNR:浏览文件的记录数 FS:设置输入域分隔符,等价于命令行 -F选项 NF:浏览记录的域的个数 NR:已读的记录数 OFS:输出域分隔符 ORS:输出记录分隔符 RS:控制记录分隔符 # 查看文件 文件名、行号、每行的列数、$0对应的完整内容 awk -F":" '{print "filename:" FILENAME "\tlinenumber:" NR "\tcolumns:" NF "\tlinecontent:"$0}' /etc/passwd # 查看文件,使用printf %s代表变量,结尾按照顺序赋值变量。 awk -F':' '{printf("filename:%s\tlinenumber:%s\tcolumns:%s\tlinecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd
awk中同时提供了print和printf两种打印输出的函数。
print函数的参数可以是变量、数值或者字符串。字符串必须用双引号引用,参数用逗号分隔。如果没有逗号,参数就串联
在一起而无法区分。这里,逗号的作用与输出文件的分隔符的作用是一样的,只是后者是空格而已。
printf函数,其用法和c语言中printf基本相似,可以格式化字符串,输出复杂时,printf更加好用,代码更易懂。
# awk 赋值变量 # 查看用户个数。count++为自定义变量,后面count则是调用count变量。count默认为0 ++ 为按行加1 awk -F":" '{count++;print $1} END{print "user count is",count}' /etc/passwd # 查看用户个数。自定义变量,指定默认为0 按行算每行+1. awk 'BEGIN {count=0;print "[start]user count is ",countq} {count=count+1;print $0;} END{print "[end]user count is ",count}' /etc/passwd # 打印当前目录下占用的全部字节数,size默认定义为0,与每个$5字节相加,除,求出M,并打印 ls -l | awk 'BEGIN {size=0;} {size=size+$5} END{print "[end]size is ",size/1024/1024,"M"}'
# awk 条件语句 格式: if (expression) { statement; statement; ... ... } if (expression) { statement; } else { statement2; } if (expression) { statement1; } else if (expression1) { statement2; } else { statement3; } # 当前文件内文件相加,并判断不等于178的文件就相加,起到过滤,并取出M,打印结果。 ls -l | awk 'BEGIN {size=0;print "[start]size is",size} {if($5!=178){size=size+$5;}} END{print "[end]size is ",size/1024/1024,"M"}' # 数组,循环,打印用户名与序号。 awk -F":" 'BEGIN {count=0} {name[count] = $1;count++;}; END{for (i = 0;i < NR;i++) print i,name[i]}' /etc/passwd