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更加好用,代码更易懂。
print 与 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

 

posted @ 2018-01-14 21:22  kevin.Xiang  阅读(397)  评论(0编辑  收藏  举报