加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

牛皮的awk命令

发布时间:2020-12-14 00:09:34 所属栏目:Linux 来源:网络整理
导读:? 1、awk介绍【单独的编程语言解释器】 ? 全称Aho Weinberger Kernaighan三个人的首字母缩写; ? 1970年第一次出现在Unix机器上,后来在开源领域使用它; ? 所以,我们在Linux中使用,改名为GNU awk;所以,在Linux 上实际上叫做gawk; ? grep行过滤器 ?? 参数:

?

1、awk介绍【单独的编程语言解释器】
?  全称Aho Weinberger Kernaighan三个人的首字母缩写;
?  1970年第一次出现在Unix机器上,后来在开源领域使用它;
?  所以,我们在Linux中使用,改名为GNU awk;所以,在Linux 上实际上叫做gawk;
?  grep行过滤器
??    参数:-o只显示匹配内容?? -i忽略大小写??? -v取反??? -E使用扩展正则表达式
?  sed行编辑器
??    参数:-n取消默认输出???? p打印
??    使用方式有:地址定界,正则表达
??    命令:p???? a?????? i?????? w??????? c???????? s???
?  awk报告生成器
??    通过模式匹配以及自己本身的语言格式,来获取、并输出客户所需要的内容;
??    awk -F: ‘{if($3>=1&&$3< = 500){print $3}}‘ /etc/passwd
??    # awk最后实现这个功能的时候只需要一句话就可以!
??    格式化输出的意义:
??    awk -F:-V OFS="." ‘BEGIN{printf”username????? udi???????? n===================n"{if($3>=18&$3<= 500){printf "用户名:%-10s UID:%-10dn",$1,$3}END{printf"------------------------------nendn"}‘ /etc/pass
2、awk工作原理
?  依次把匹配到的行使用awk工具进行编辑或者格式化打印输出,所以关于行的循环,在awk中,就可以不使用了
3、awk的用法
?awk?? 参数...??? ‘‘??? FILE..
?  1)program必须使用单引号
?  2)多条program语句使用大括号包含起来,可以并列,可以嵌套
??    awk ‘print‘ /etc/passwd
4、awk的常见参数
?  -F???? 指定分割符??? 还可以指定多个???? awk -F[/:]
?  -v???? 因为awk是一种语言编译器,能自己定义变量们同事也有内置变量(与环境变量类似)
??    而-v就是手动指定参数
??    awk -v a =“a/b”‘{print a}‘ a.txt??? 给a赋值,打印a这个变量
??    1)a是自定义变量 -v FS":"
??    2)在awk中调用自定义变量不用加$符号
??      ?awk ‘{a="a/b";print a}‘ a.txt
5、awk的语法格式? --program
?  1)print
?    ?默认输出 (在屏幕上显示)
??    在awk中没有保存命令,我们可以关联别的命令来保存结果
?  2)printf--实现格式化输出
??    printf "%s是%d班的最好的学生",变量1,变量2
??    格式符:
??      ?%s
???      %d? %i?? 数值
???      %e? %E?? 科学计算数
???      %c Acs值、
???      %f浮点数
???      %%逃逸符,只显示%自己
??      ?%u无符号整数
??    修饰符:
??      ?默认为右对齐
???      - 代表左对齐
???      %5.4f????? 5表示所占位数????? 4所取小数位
?3)变量(内置变量、自定义变量)
??  内置变量--环境变量(bash)查看环境变量命令(env 、set -C? +C)
???     awk语言所默认支持的变量
???     FS 定义输入分隔符的变量
???     OFS定义输出分隔符的变量
???     NF???? 定义分割以后的参数个数($NF 分隔以后最后一列变量)
???     NR 定义文件的行数,定义多个文件的文件的行号叠加
???     FNR 文件只计算自己的行号
???      awk {print NR}‘ /etc/fstab /etc/passwd
???      awk ‘{print FNR}‘ /etc/fstab /etc/passwd
???        ?FILENAME存储文件的名字
???      awk ‘{print FILENAME}‘ /etc/passwd //把文件名打印N次, N文件的行数
???      awk ‘BEGIN{print FILENAME}‘ /etc/passwd //BEGIN的意思是只执行一次这个打印
????        ARGC?整个命令的段数?? 【不包含program本身】
???      awk ‘BEGIN{print ARGC} /etc/passwd /etc/fstab /etc/shadow
????        ARGV数组,来调取命令中,指定的段例如ARGV[2]
????        RS?? 指定换行符???? 可以指定心的换行符,不影响本身的换行
????        ORS?? 输出的时候指定换行符,将默认换行符替换为指定换行符
?  ?自定义变量
???    -v? 变量=值
????      在后面的‘program‘中去调用自定义变量时4,直接使用即可
???      或者将“变量=值”直接写在‘program‘里面
6、模式匹配(地址定界
???      1)空值,没有定义,默认就将文件中的所有的行,放入awk进行循环
???      2)对固定的1,3行进行操作
???          ?awk ‘1,3{print}‘????? #注意awk默认不支持1-3 1,3等等
???          ?awk? ‘NR>=1&&NR<=3;{print}‘? /etc/passwd
???      3)匹配
???          ?awk ‘/r..ter/{print}‘?? /etc/passwd
??      ?4)匹配模式可以直接使用判断语句
????          awk -F: ‘$NF =="/bin/bash"{print $1,$3}‘ /etc/passwd
???      5)BIGEIN|END语句
???      BIGEIN定义在默认循环进行操作前要执行的语句
???          awk -F: ‘BEGIN{printf "shell程序为bash的用户为: n"}$NF=="/bin/bash"{print $1,$3}‘ /etc/passwd
???          awk -F: ‘BEGIN{printf "shell程序为bash的用户为: n"}$NF= = "/bin/bash"{print $1,$3}END{printf "endn"}‘
??          ?一般在格式化输出的时候,打印表头和表末;
7、操作符    
?    运算操作符:
??      + - * / % ** //
?    比较运算符:
?      ?==? !=?? > < >=??? <=
      ??~!~
??      awk -F: ‘$NF~"/bin/bash" {print $1,$3}‘ /etc/passwd
??      awk -F: ‘$NF!~ "/bin/bash"{print $1,$3}‘ /etc/passwd
?    逻辑操作符:
??      &&
?      ?||
?      ?!
?    赋值操作符:
?      ?=? +=? -= /= *=
?    条件表达式:
??      条件语句?条件成立语句
8、常见action
?    print? printf 以及其他任何操作都是action
9、常见语言
?  1)if语句
??    语法格式:if(条件表达式){执行语句}
???      if(条件表达式){执行语句}?else{执行语句}
???      awk ‘/^title/{if(NF <= 2) {print}else {print 参数过少}}’ /boot/grub/grub.conf
??      ?awk ‘/title/{if(NF<=2) print $4}‘ /boot/grub/grub.conf
?  2)while语句
?      ?只有对行参数进行遍历的时候才会使用循环;
??      语法格式:while (条件表达式){循环体}
??      awk /^[[:spacel]*kernel&; /{i= 1;while(i< = NF){printf $i"t";print length($i);i+ + }}‘ grub.conf
?  3)for语句
?      ?语法格式:for(初始值;条件判断初始值控制语句){循环体}
?      awk ‘/^[[:space:]*kernel&; /{for(i=1; i<=NF; i++){printf $i"t"; print length($)}} grub.conf
?      ?循环建议使用for语句
?  练习:统计一下啊某个文件中指定行中单词出现的次数;
??    在awk中,for也可以使用shell中一样的格式:
??    回顾:
???      for i in 列表;do
????      循环体
???      done
??      for(i in 列表){循环体}
??      echo "xia liang z shi k hen n shuai da fa le"|awk
?   4)do-while循环
??      语法:do {循环体}while(循环条件)
??      注意和while的区别:while语句只有在满足条件的时候,才会进入循环,而do while会先执行一次循环体,再进行条件判断
?  5)循环跳出语句
??    break [n] 跳出本次循环;
??    continue 跳出本次循环;
??    next 跳出默认的当前循环;
?    awk ‘{if(NR%2==1){next}else {print}}‘ /etc/passwd
?  6)switch类似于case
?    ?语法格式:    
??    ?switch(表达式){case 模式匹配值;执行语句;case 模式匹配值;执行语句。。。,default ;执行语句}
10、数组
?    在awk中,数组和shell中的数组特性相同;
??      注意:awk中数组不用定义,只要使用了,就有值为空的默认数组;这在做数据统计的时候非常常见
?    行遍历--->实际上就是整个文件的遍历
    ?列遍历--->取对象固定某列的中的,相同数据的统计
?      ?注意:数组通过for语句,再给其他变量赋值的时候,赋值的是index索引信息
?    练习:统计一下某个文件中指定行中单词出现的次数;
?      awk -v RS=" " {print} a.txt | awk "{ls[$1]+ +}END{for(i in ls){print ls[[i]}}‘
?    练习:统计-下一个文件中每个单词(以空格隔开的字符串)出现的次数;
?      awk ‘{for(i= 1;i< =NF;i+ +){count[$i]+ +}}END{for(i in count) {print i,count[i]}‘ /etc/fstab
      ?awk ‘{for(i= 1;i< =NF;+ +){ls[$i]+ + }END{for (j in Is){print j,ls[j]}"‘ /var/log/httpd/access log | sort -t" " -k2 -nr
11、函数
?  1)内置函数
??      函数的调用:funcation(参数)
??      length()统计字符串长度
??      数学运算上使用的行数sin()
??      sub(x,x,x)替换第一个匹配到的值
???        awk? ‘{print sub(o,O,$1)}‘ /etc/passwd //将o替换为O文件中的第一列(匹配一个)
??      gsub
???        awk? ‘{print gsub(o,$1)}‘ /etc/passwd将o替换为O文件中的第一列(全部匹配)
?      ?split(x,x,x)指定分隔符去切割文件
???        netstat -tan | awk ‘/^tcp&; /{split($5,ip,":");prin ip[1]}‘
???        netstat -tan | awk ‘/^tcp&; /{split($5,":");counti[ip[1]]+ +}END{for (i in count) {print i,count[i]}}‘
?2)自定义变量?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读