基本用法:gawk [options] 'program' FILE ...
            program: PATTERN{ACTION STATEMENTS}
                语句之间用分号分隔
 
                print, printf
 
            选项:
                -F:指明输入时用到的字段分隔符;
                -v var=value: 自定义变量;
 

1、print

  print item1, item2, ...

  要点:
    (1) 逗号分隔符;
    (2) 输出的各item可以字符串,也可以是数值;当前记录的字段、变量或awk的表达式;
    (3) 如省略item,相当于print $0;

2、变量

2.1 内建变量
  FS:input field seperator,默认为空白字符;
  OFS:output field seperator,默认为空白字符;
  RS:input record seperator,输入时的换行符;
  ORS:output record seperator,输出时的换行符;

  NF:number of field,字段数量
  {print NF}, {print $NF}
  NR:number of record, 行数;
  FNR:各文件分别计数;行数;

  FILENAME:当前文件名;

  ARGC:命令行参数的个数;
  ARGV:数组,保存的是命令行所给定的各参数;

2.2 自定义变量
  (1) -v var=value

    变量名区分字符大小写;

  (2) 在program中直接定义

3、printf命令

  格式化输出:printf FORMAT, item1, item2, ...

  (1) FORMAT必须给出;
  (2) 不会自动换行,需要显式给出换行控制符,\n
  (3) FORMAT中需要分别为后面的每个item指定一个格式化符号;

  格式符:
    %c: 显示字符的ASCII码;
    %d, %i: 显示十进制整数;
    %e, %E: 科学计数法数值显示;
    %f:显示为浮点数;
    %g, %G:以科学计数法或浮点形式显示数值;
    %s:显示字符串;
    %u:无符号整数;
    %%: 显示%自身;

  修饰符:
    #[.#]:第一个数字控制显示的宽度;第二个#表示小数点后的精度;
    %3.1f
    -: 左对齐
    +:显示数值的符号

4、操作符

  算术操作符:
    x+y, x-y, x*y, x/y, x^y, x%y
    -x
    +x: 转换为数值;

  字符串操作符:没有符号的操作符,字符串连接

  赋值操作符:
    =, +=, -=, *=, /=, %=, ^=
    ++, --

  比较操作符:
    >, >=, <, <=, !=, ==

  模式匹配符:
    ~:是否匹配
    !~:是否不匹配

  逻辑操作符:
    &&
    ||
    !

  函数调用:
    function_name(argu1, argu2, ...)

  条件表达式:
    selector?if-true-expression:if-false-expression

    # awk -F: '{$3>=1000?usertype="Common User":usertype="Sysadmin or SysUser";printf "%15s:%-s\n",$1,usertype}' /etc/passwd

5、PATTERN

  (1) empty:空模式,匹配每一行;
  (2) /regular expression/:仅处理能够被此处的模式匹配到的行;
  (3) relational expression: 关系表达式;结果有“真”有“假”;结果为“真”才会被处理;
    真:结果为非0值,非空字符串;
  (4) line ranges:行范围,
    startline,endline:/pat1/,/pat2/

  注意: 不支持直接给出数字的格式
    ~]# awk -F: '(NR>=2&&NR<=10){print $1}' /etc/passwd
  (5) BEGIN/END模式
    BEGIN{}: 仅在开始处理文件中的文本之前执行一次;
    END{}:仅在文本处理完成之后执行一次;

6、常用的action

  (1) Expressions
  (2) Control statements:if, while等;
  (3) Compound statements:组合语句;
  (4) input statements
  (5) output statements

7、控制语句

  if(condition) {statments}
  if(condition) {statments} else {statements}
  while(conditon) {statments}
  do {statements} while(condition)
  for(expr1;expr2;expr3) {statements}
  break
  continue
  delete array[index]
  delete array
  exit
  { statements }

7.1 if-else

  语法:if(condition) statement [else statement]

    ~]# awk -F: '{if($3>=1000) {printf "Common user: %s\n",$1} else {printf "root or Sysuser: %s\n",$1}}' /etc/passwd

    ~]# awk -F: '{if($NF=="/bin/bash") print $1}' /etc/passwd

    ~]# awk '{if(NF>5) print $0}' /etc/fstab

    ~]# df -h | awk -F[%] '/^\/dev/{print $1}' | awk '{if($NF>=20) print $1}'

  使用场景:对awk取得的整行或某个字段做条件判断;

7.2 while循环
  语法:while(condition) statement
    条件“真”,进入循环;条件“假”,退出循环;

  使用场景:对一行内的多个字段逐一类似处理时使用;对数组中的各元素逐一处理时使用;

    ~]# awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {print $i,length($i); i++}}' /etc/grub2.cfg

    ~]# awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>=7) {print $i,length($i)}; i++}}' /etc/grub2.cfg

7.3 do-while循环
  语法:do statement while(condition)
  意义:至少执行一次循环体

7.4 for循环
  语法:for(expr1;expr2;expr3) statement

  for(variable assignment;condition;iteration process) {for-body}

  ~]# awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}' /etc/grub2.cfg

  特殊用法:
    能够遍历数组中的元素;
  语法:for(var in array) {for-body}

7.5 switch语句
  语法:switch(expression) {case VALUE1 or /REGEXP/: statement; case VALUE2 or /REGEXP2/: statement; ...; default: statement}

7.6 break和continue
  break [n]
  continue

7.7 next:提前结束对本行的处理而直接进入下一行;

  ~]# awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd

8、array

  关联数组:array[index-expression]

  index-expression:
    (1) 可使用任意字符串;字符串要使用双引号;
    (2) 如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为“空串”;

  若要判断数组中是否存在某元素,要使用"index in array"格式进行;

    weekdays[mon]="Monday"

  若要遍历数组中的每个元素,要使用for循环;
    for(var in array) {for-body}

  ~]# awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";for(i in weekdays) {print weekdays[i]}}'

  注意:var会遍历array的每个索引;
    state["LISTEN"]++
    state["ESTABLISHED"]++

  ~]# netstat -tan | awk '/^tcp\>/{state[$NF]++}END{for(i in state) { print i,state[i]}}'

  ~]# awk '{ip[$1]++}END{for(i in ip) {print i,ip[i]}}' /var/log/httpd/access_log

练习1:统计/etc/fstab文件中每个文件系统类型出现的次数;
  ~]# awk '/^UUID/{fs[$3]++}END{for(i in fs) {print i,fs[i]}}' /etc/fstab

练习2:统计指定文件中每个单词出现的次数;
~]# awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count) {print i,count[i]}}' /etc/fstab

9、函数

9.1 内置函数
  数值处理:
    rand():返回0和1之间一个随机数;

  字符串处理:
    length([s]):返回指定字符串的长度;
    sub(r,s,[t]):以r表示的模式来查找t所表示的字符中的匹配的内容,并将其第一次出现替换为s所表示的内容;
    gsub(r,s,[t]):以r表示的模式来查找t所表示的字符中的匹配的内容,并将其所有出现均替换为s所表示的内容;

    split(s,a[,r]):以r为分隔符切割字符s,并将切割后的结果保存至a所表示的数组中;

    ~]# netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for (i in count) {print i,count[i]}}'

9.2 自定义函数

《sed和awk》

【Linux】【Shell】【text】awk的更多相关文章

  1. 【Linux下自定义Shell终端提示符】

    目录 基本转义符 字体颜色 背景颜色 移动光标 @ Linux系统终端提示符的特征由系统环境变量 PS1(Prompt String One)定义. 我们可以通过命令echo $PS1来查看当前设置, ...

  2. 【Linux&amp;Unix--open/close/write/read系统调用】

    个人学习整理.如有不足之处,请不吝不吝赐教. 转载请注明:@CSU-Max 系列博文:      Linux&Unix学习第一弹 -- 文件描写叙述符与权限  Linux&Unix学习 ...

  3. 【Linux运维-集群技术进阶】Nginx+Keepalived+Tomcat搭建高可用/负载均衡/动静分离的Webserver集群

    额.博客名字有点长.. . 前言 最终到这篇文章了,心情是有点激动的. 由于这篇文章会集中曾经博客讲到的全部Nginx功能点.包含主要的负载均衡,还有动静分离技术再加上这篇文章的重点.通过Keepal ...

  4. 【linux之设备,分区,文件系统】

    一.设备 IDE磁盘的设备文件采用/dev/hdx来命名,分区则采用/dev/hdxy来命名,其中x表示磁盘(a是第一块磁盘,b是第二块磁盘,以此类推), y代表分区的号码(由1开始,..3以此类推) ...

  5. 【linux之挂载,Raid,LVM】

    一.挂载,卸载 挂载:将新的文件系统关联至当前根文件系统卸载:将某文件系统与当前根文件系统的关联关系移除 cat /etc/mtab 存储着已经挂载的文件系统 (跟 mount 一样) mount:显 ...

  6. 【linux之进程管理,系统监控】

    一.进程管理 前台进程:一般是指占据着标准输入和/或标准输出的进程后台进程:不占据默认开启的进程都是前台进程ctrl+C 中断ctrl+z 从前台转入后台bg 后台进程编号 让其在后台运行ls -R ...

  7. 【python中调用shell命令使用PIPE】使用PIPE作为stdout出现假卡死的情况——将stdout重定向为输出到临时文件

    在Python中,调用:subprocess.Popen(cmd, stdout = PIPE, stderr = PIPE, shell= true)的时候,如果调用的shell命令本身在执行之后会 ...

  8. 【Linux磁盘优化管理--RAID和LVM】

    在现阶段的企业环境中,为了数据的安全性及完整性必须要有一个合理的存储方案.面对着每秒可能产生超过几TB的数据,考虑到磁盘能不能实现 热冗余,及扩容,缩容.Linux给出了RAID(磁盘阵列)以及LVM ...

  9. 【Linux 内核网络协议栈源码剖析】网络栈主要结构介绍(socket、sock、sk_buff,etc)

    原文:http://blog.csdn.net/wenqian1991/article/details/46700177 通过前面的分析,可以发现,网络协议栈中的数据处理,都是基于各类结构体,所有有关 ...

  10. 【linux之链接,函数,随机数】

    一.链接 硬链接(hard link):同一个文件使用了多个别名.新建文件是已经存在的一个别名,,当原文件删除时,新建的文件仍然可以使用.硬链接和原来的文件没有什么区别,而且共享一个inode号.通过 ...

随机推荐

  1. 在代码生成工具Database2Sharp中增加Vue&Element 工作流页面的快速生成

    在我们基于框架开发系统的时候,往往对一些应用场景的页面对进行了归纳总结,因此对大多数情况下的页面呈现逻辑都做了清晰的分析,因此在我们基于框架的基础上,增量式开发业务功能的时候,能够事半功倍.代码生成工 ...

  2. logstash写入kakfa数据丢失的问题

    metricbeat采集系统指标,发送到logstash,再写入kafka,发现kafka中的数据不完整,只有某一个指标, 查找原因发现是logstash配置编码问题,如下: input { beat ...

  3. django improperly configured

    ImproperlyConfigured: You must either define the environment variable DJANGO_SETTINGS_MODULE or call ...

  4. 第12组 Alpha冲刺 (1/6)

    过去两天完成了哪些任务 文字描述 静态页面代码编写以及一些点击事件 展示GitHub当日代码/文档签入记录 接下来的计划 1.继续学习echarts 2.编写所需要的图表代码 还剩下哪些任务 1.图表 ...

  5. Django 小实例S1 简易学生选课管理系统 1 项目流程梳理与数据库设计

    Django 小实例S1 简易学生选课管理系统 第1章--项目流程梳理与数据库设计 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 1 项目流程梳理 ...

  6. C++的重载操作符(operator)介绍

    原文转载至:https://blog.csdn.net/liitdar/article/details/80654324 https://blog.csdn.net/liitdar/article/d ...

  7. 基于echarts 24种数据可视化展示,填充数据就可用,动手能力强的还可以DIY(演示地址+下载地址)

    前言 我们先跟随百度百科了解一下什么是"数据可视化 [1]". 数据可视化,是关于数据视觉表现形式的科学技术研究. 其中,这种数据的视觉表现形式被定义为,一种以某种概要形式抽提出来 ...

  8. 数字逻辑实践3->EDA技术与Verilog设计

    本文属于EDA技术概述类文章 1 EDA技术及其发展 概念 EDA(Electronic Design Automation),指的是以计算机为工作平台,以EDA软件工具为开发环境,以PLD期间或者A ...

  9. 第一章 初始C语言

    第一章 初始C语言 目录 第一章 初始C语言 1. C语言起源 2. 选择C语言的理由 2.1 设计特性 2.2 高效性 2.3 可移植性 2.4 强大而灵活 2.5 面向程序员 3. C语言的应用范 ...

  10. myeclipse字体大小格式的设置