经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库运维 » LinuxShell » 查看文章
awk命令的基本使用
来源:cnblogs  作者:linyouyi  时间:2018/10/11 9:12:53  对本文有异议

命令主要用法
  -格式1:前置命令 | awk [选项] '[条件]{编辑指令}'
  -格式2:awk [选项] '[条件]{编辑指令}' filename

常用命令选项
  -F:指定分隔符,可省略(默认空格或者Tab位)
  -f:调用awk脚本尽心个处理
  -V:调用外部shell变量

内置变量
  变量       用途
  FS        保存或设置字段分隔符,如FS=":"
  $n        指定分隔的第n个字段,例如$1,$4分别表示第1例,第4例
  $0        当前读入的整行文本内容
  NF        记录当前处理行的字段个数(有多少列)
  FNR        记录当前处理行在原文本内的行号
  NR        记录当前已经读入行的数量(多个文本一起读取时,行数累加)
  FILENAME  当前处理的文件名
  ENVIRON   调用shell环境变量,格式:ENVIRON["变量名"]

awk过滤的时机
  BEGIN{}
    读入第一行文本之前执行
    一般用来初始化操作
  逐行处理{}
    逐行读入文本执行相应的处理
    是最常见,用的多少的编辑指令块

  END{}
    处理完最后一行文本后执行
    一般用来出数处理结果
    

  1. [root@localhost ~]# awk '{print "第" FNR"行" ,"有"NF"列"}' a.txt
  2. 1 2
  3. 2 4
  4. 3 2
  5. 4 3

 

1)输出当前用户的UID

  1. [root@localhost ~]# awk -F: '$1==ENVIRON["USER"]{print $3}' /etc/passwd
  2. 0

 2)预处理

  1. [root@localhost ~]# awk 'BEGIN{a=10;print a+10}'
  2. 20

3)统计使用bash的用户数量

  1. [root@localhost ~]# awk 'BEGIN{x=0}/\<bash$/{x++}END{print x}' /etc/passwd
  2. 1

 

awk处理条件概述
  格式
    awk [选项] '[条件]{指令}' filename
  条件的表现形式
    正则表达式
      /正则内容/
      ~匹配,!~不匹配
    数值/字符串比较
      ==,!=,>=,<=,>,<等
    逻辑比较
      &&逻辑与:期望多条件都成立
      ||逻辑或:只要有一个条件成立即满足要求
    运算符
      -,+,*,/,%,++,--,+=,-=,*=,/=

1)正则内容

  1. [root@localhost ~]# awk -F: '/^root/{print}' /etc/passwd
  2. root:x:0:0:root:/root:/bin/bash

2)~匹配,!~不匹配

  1. [root@localhost ~]# awk -F: '$7!~/nologin/{print}' /etc/passwd
  2. root:x:0:0:root:/root:/bin/bash
  3. sync:x:5:0:sync:/sbin:/bin/sync
  4. shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
  5. halt:x:7:0:halt:/sbin:/sbin/halt

3)==,!=,>=,<=,>,<等,输出第二行文本

  1. [root@localhost ~]# awk 'NR==2{print}' /etc/passwd
  2. bin:x:1:1:bin:/bin:/sbin/nologin

4)&&逻辑与:期望多条件都成立

  1. [root@localhost ~]# awk -F: '$3>=0&&$3<=10{print $1,$3}' /etc/passwd
  2. root 0
  3. bin 1
  4. daemon 2
  5. adm 3
  6. lp 4
  7. sync 5
  8. shutdown 6
  9. halt 7
  10. mail 8
  11. uucp 10

5)运算符,统计文本总字段数量

  1. [root@localhost ~]# awk -F: 'BEGIN{i=0}{i+=NF}END{print i}' /etc/passwd
  2. 140

 

awk流程控制
  单分支
    if(条件){指令}
  双分支
    if(条件){指令}else{指令}
  多分支
    if(条件){指令}else if{指令}else{指令}

  while循环
    while(条件){指令}
  do while
    do{指令}while(条件)

  for循环
    for(初始值;条件;步长){指令}

 

1)统计UID小于或等于500的用户个数

  1. [root@localhost ~]# awk -F: 'BEGIN{i=0;j=0}{if($3<=500){i++}else{j++}}END{print i,j}' /etc/passwd
  2. 21 1

 2)统计root出现次数

  1. [root@localhost ~]# awk -F[:/] '{i=1}{while(i<=NF){if($i~/root/){j++};i++}}END{print j}' /etc/passwd
  2. 4

3)for循环

  1. [root@localhost ~]# awk 'BEGIN{for(i=0;i<=10;i++){print i}}'
  2. 0
  3. 1
  4. 2
  5. 3
  6. 4
  7. 5
  8. 6
  9. 7
  10. 8
  11. 9
  12. 10

 

数组
  定义数组
    格式:数组名[下标]=元素值
  调用数组
    格式:数组名[下标]
  遍历数组
    用法:for(变量 in 数组名){print 数组名[变量]}
  数组的经典使用
    去除文本重复行:awk '!a[$2]++{print $2}' filename
    逐行分析,遇到重复行就跳过

1)去重

  1. [root@localhost ~]# cat a.txt
  2. 111 111
  3. 222222 22 2222 2
  4. 333333333 33
  5. 444444444444 444 44
  6. 444444444444 444 44
  7. [root@localhost ~]# awk '!a[$2]++{print $2}' a.txt
  8. 111
  9. 22
  10. 33
  11. 444

2)列出用户登陆shell的种类

  1. [root@localhost ~]# awk -F: '!shell[$7]++{print $7}' /etc/passwd
  2. /bin/bash
  3. /sbin/nologin
  4. /bin/sync
  5. /sbin/shutdown
  6. /sbin/halt

3)列出用户登陆shell的种类及个数,类似的可以统计web访问ip及访问次数

  1. [root@localhost ~]# awk -F: '{shell[$7]++}END{for(i in shell){print i,shell[i]}}' /etc/passwd
  2. /bin/sync 1
  3. /bin/bash 3
  4. /sbin/nologin 16
  5. /sbin/halt 1
  6. /sbin/shutdown 1
  7. [root@localhost ~]# awk -F: '{shell[$7]++}END{for(i in shell){print i,shell[i]}}' /etc/passwd | sort -nr -k2
  8. /sbin/nologin 16
  9. /bin/bash 3
  10. /sbin/shutdown 1
  11. /sbin/halt 1
  12. /bin/sync 1

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号