awk的使用

  • grep:用于过滤文本;

  • sed:流编辑器;

  • awk是一个报告生成器,用于将信息进行格式化之后,然后进行显示,通常使用的是
    这里写图片描述

  • awk的基本处理机制:

    • awk每一次读取其中的一行文本,然后按照分隔符进行切片,在awk内部按照每一个变量来引用分隔符分开的各个字段,使用$0:表示该行文本的内容,$1-->$n用于表示之后的每一段文字的切片,在指定输出格式时awk '{print $1,$2}' a.text,但是在输出时,使用的是默认的分隔符;指定分隔符使用的是-F选项;
      这里写图片描述
  • print的使用格式:

  • 注意:

    • 1.各个项目之间使用,进行分割,而输出默认是空白字符;
    • 2.输出的item可以为字符串或者数值,当前记录的字段$1--->$n,变量或者awk的表达式,对于数值会转换成为字符串然后进行输出;
    • 3.print命令后面的item可以省略,相当于print $0,想要输出空白行,则需要使用print " ";
  • 内置变量

  • 记录变量:

  • FS: filed separator:表示输入分隔符号,默认是空白字符,可以通过-F指定,也可以通过FS变量进行指定,通常表示的是按照行读取每一行文本时,使用的字段分隔符号;
    这里写图片描述

  • RS:表示的含义输入文本时,使用的分隔符号,也就是行结束符号;

  • OFS:用于指定输出字段分隔符号;

  • ORS:用于指定的是输出行字段分隔符号;

  • 数据变量:

  • NR:用于表示awk命令所处理的记录数,如果有多个文件,这个数目会将会把多个文件的行统一计数;
    这里写图片描述

  • FNR:同样是用于计数,但是对于多个文件是分开计数的.用于记录当前文件被处理的行数;
    这里写图片描述

  • NF:记录当前filed的个数;
    这里写图片描述

  • ARGV:是一个数组,用于保存命令本身这个字符串,例如awk '{print $0}' a.txt b.txt,其中ARGV[0]保存的就是awk,ARGV[1]保存的就是'{print $0}';

  • ARGC:表示awk命令执行参数的个数;

  • FILENAME:当前shell环境变量以及其值的关联数组;

  • 用户自定义变量:

  • gawk允许用户自定义变量,变量的命名规则:只能够使用数字字母和下划线,但是不能够使用数字开头,并且严格区分大小写;

  • 用户自定义变量的两种方式:
    这里写图片描述

  • printf的使用

  • 1.和print的不同在于printf需要指定format;

  • 2.format用于指定后面的每个item的输出格式;

  • 3.printf语句不会自动打印换行符号;

  • format的格式都是使用%开头,后面跟一个字符,如下:

    • %c:显示字符的ASCII码;
    • %d.%i:用于显示字符的十进制数;
    • %e %E:使用科学计数法显示数值;
    • %f:显示浮点数;
    • %g %G:使用科学计数法的格式或者浮点数的格式显示数值;
    • %s:显示字符串;
    • %u:无符号整数;
    • %%:显示%本身;
  • 使用的几个修饰符:

    • N:显示宽度;
    • -:左对齐;
    • +:显示数值符号;
      这里写图片描述
  • 重定向操作

  • 特殊文件描述符号:

    • /dev/stdin:标准输入;
    • /dev/stdout:标准输出;
    • /dev/stderr:错误输出;
    • /dev/fn/n:某个特定的文件描述符号;
  • 使用上面的方式来支持重定向操作
    这里写图片描述

  • 支持算术表达式

  • -x +x x^y x**y x/y x+y x-y x%y

  • 需要注意的是,如果某个模式为"号,使用/"/会导致语法错误,应该使用的/[*]/来代替;

  • 布尔值

  • awk中,任何非0值或者非空字符串都为真,反之为假;

  • x<y x>y x<=y x>=y x==y

  • x~y:表示x符合于正则表达式y的要求;

  • x!~y:表示x不符合于正则表达式Y的要求;

  • 表达式之间的逻辑关系运算符号

  • &&:表示与关系;

  • ||:表示或关系;

  • 条件表达式

  • selector?of-true-exp:if-false-exp

  • 函数调用

  • function_name(para1,para2)

  • awk的模式

  • Regexp:正则表达式,格式为/regular expression/;
    这里写图片描述

  • expression:支持表达式,其值为非0或者为非空字符时满足条件,如:$1 ~ /foo/或者使用$1 == "lixxun";
    这里写图片描述

  • 显示用户的shell类型为bash
    这里写图片描述

  • range指定模式进行匹配,格式为pat1, pat2
    这里写图片描述

  • BEGIN/END:表示特殊模式,仅在awk命令执行前运行一次或者结束前运行一次;
    这里写图片描述

  • 常见的action

  • expression:赋值表达式,判断表达式;

  • Control statement:控制语句;

  • 控制语句:

  • if-else:

if (condition) {then-body} else {[else-body]}
  • 例如awk -F: '{if ($1=="root") print $1,"Admin";else print $1,"Common User"}' /etc/passwd;
    这里写图片描述
  • 或者:
    这里写图片描述
  • 统计系统上面存在多少个UID>500的用户
    这里写图片描述
  • while语句:
while (condition){statement1;statement2;...}
  • 例如判断每一行中的每一字段的长度是否大于4

这里写图片描述

  • do-while循环:
  • do {statement1,statement2,....} while (conditaion)

这里写图片描述

  • for循环是用来遍历数组的
for (variable assignment; condition;iteration process) {statement1,statement2,...}

这里写图片描述

  • 支持case语句
switch (expression) {case VALUE or /REGEXP/:statement1,statement2,...default:statement1,...}
  • breakcontinue:
  • 用于结束寻循环和case语句,通常处理的字段;
  • next
  • 提前结束对于本行文本的处理,并接着处理下一行;例如:显示ID号为奇数的用户;
    这里写图片描述
  • awk中的数组
  • array[index-expression]:index-expression可以使用任意字符串,需要注意的是,如果某数据组元素事先不存在,那么在引用其时,awk会自动创建此元素并初始化为空串,因此,要判断某数据组中是否存在某些元素,需要使用index in array的方式;
  • 如果需要遍历数组中的每一个元素,需要按照下面的方式
for (var in array) {statement1,statement2,...}
  • 其中var用于引用数组下标,而不是数组元素;
  • 例子:
    这里写图片描述
  • 例如
    这里写图片描述
  • 统计TCP连接的状态
    这里写图片描述
  • 统计某日志文件中,IP地址的访问量
awk '{counts[$1]++}END{for(ip in counts) printf"%-20s:%d\n",ip,counts[ip]}}' 
  • 可以用于统计某个日志文件IP出现的次数;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值