awk

栏目: 服务器 · 发布时间: 8年前

内容简介:awk

文本处理工具

  • 文本处理三工具:grep,sed,awk
    • grep,egrep,fgrep:文本过滤工具
    • sed:行编辑器
    • awk:报告生成器,格式化文本输出;
  • gawk – pattern scanning and processing language

    lrwxrwxrwx. 1 root root 4 May 17 19:23 /bin/awk -> gawk

  • 基本用法:gawk [ options ] -f ‘program’ FILE …

    • program:PATTERN{ACTION STATEMENTS};语句之间用分号分隔;

      • print,printf
    • options:

      • -F:指明输入时用到的字段分隔符;默认为空白字符;
      • -v:var=value:自定义变量
  • print item1,item2,…
  • 要点:
    1. 逗号分隔符;
    2. 输出的各item可以字符串,也可以是数值;当前记录的字段、变量或awk的表达式;
    3. 如省略item,相当于:print $0
  • 内建变量

    • FS:input field seperator,默认为空白字符;
    • OFS:output field seperator,默认为空白字符;
    • RS:input record seperator,输入时的换行符;
    • ORS:output record seperator,输出时的换行符;
      ~]# awk -v FS=':' '{print $1}' /etc/passwd
      ~]# awk -F: '{print $1}' /etc/passwd
    • NF:number of field,字段数量;
      {print NF},{print $NF}
    • NR:number of record,行数;
    • FNR:各文件分别计数,行数;
    • FILENAME:当前正在处理的文件名;
    • ARGC:命令行参数的个数;
    • ARGV:数组,保存的是命令行所给定的各参数;
  • 自定义变量

    • -v var=value
      变量名区分字符大小写;
    • 在program中直接定义
  • 格式化输出:printf FORMAT,item1,item2, …

    • FORMAT必须给出;
    • 不会自动换行,需要显式给出换行控制符,\n
    • FORMAT中需要分别为后面的每个item指定一个格式化符号;使用“” ;

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

        #[.#]:第一个数字控制显示的宽度;第二个#表示小数点后的精度;
          awk -F: '{printf "username: %15s,Uid: %d\n",$1,$3}' /etc/passwd
              username:后面的数字宽度为15个字符;
              默认右对齐;
        
        -:表示左对齐
        awk -F: '{printf "username: %-15s,Uid: %d\n",$1,$3}' /etc/passwd
        username:后的内容左对齐;
        
        +:显示数值的符号;
  • 算术运算操作符:
    • 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="systemuser";printf "%15s:%-s\n",$1,usertype}' /etc/passwd

PATTERN

  • empty:空模式,匹配每一行;
  • /regular expression/:仅处理能够被此处的模式所匹配到的行;
  • relational expression:关系表达式;结果有“真”有“假”;结果为“真”才会被处理;

    • 真:结果为非0值,非空字符串;
    ~]# awk -F: '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd
    root /bin/bash
    magedu /bin/bash
    ~]# awk -F: '$NF~/bash/{print $1,$NF}' /etc/passwd
    root /bin/bash
    magedu /bin/bash
  • line ranges:行范围
    • startline,endline:/pat1/,/pat2/
    • 不支持直接给出数字的格式
      ~]# awk -F: ‘(MR>=2&&NR<=10){print $1}’ /etc/passwd
  • BEGIN/END 模式
    • BEGIN{}:仅在开始处理文件中的文本之前执行一次的程序
      BEGIN可以打印表头
    • END{}:仅在文本处理完成之后,命令结束之前,执行一次的程序
      可以显示最后的结果

常用的action

  • Expressions:算术,比较表达式 a>b等等
  • Control statements:if、while等
  • Compound statements:组合语句,将多个语句当做一个代码块的用法
  • Input statements:输入语句
  • Output statements:输出语句,print

控制语句

  • If(condition) {statements} else {statements}

    While (condition) {statements}

    Do {statements} while (condition)

    For (expr1;expr2;expr3) {statements}

    Break

    Continue

    Delete array[index]

    Delete array

    Exit

    {compound statements}

  • if-else

    • 语法:If(condition) {statement} else {statements}

      • If(condition) statements
        ~]# awk -F: '{if($NF=="/bin/bash") print $1}' /etc/passwd
        ~]# awk '{if(NF>5) print $0}' /etc/fstab
      • If(condition) {statements} else {statements2}
        ~]# awk -F: '{if($3>=1000) {printf "common user: %s\n",$1} else {printf "root or sysuser: %s\n",$1}}' /etc/passwd
      • If(condition) {statements} else if (condition2) {statements2} else {statements3}
    • 使用场景:对awk取得的整行或某个字段做条件判断;

  • While循环

    • 语法:while(condition) statement

      条件为“真” ,进入循环;条件为“假”,退出循环;有可能不被执行(如第一次判断为假)

      ~]# awk '/^[[:space:]]*linux16/{i=1;while(i<=NF){print $i,length($i);i++}}' /etc/grub2.cfg
      
      当length大于7时显示:
      ~]# awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>=7) {print $i,length($i)}; i++}}' /etc/grub2.cfg
    • 使用场景:对一行内的多个字段逐一进行类似处理的时候;对数组中各元素逐一处理时使用
  • Do-while 循环

    • 语法:do {statement} while(condition)

      意义:无论真假,至少执行一次循环体

      ~]# awk 'BEGIN{ total=0;i=0;do{total+=i;i++;}while(i<=100);print total}'
      5050
  • 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}

  • Switch 语句

    • 语法:Switch(expression) {case VALUE1 or /REGEXP/: statement; case VALUE2 or /REGEXP2/: statement ; …… ;default: statement}
  • break和continue

    • continue,退出本轮循环,直接进入下一轮;
      ~]# awk 'BEGIN{sum=0;for(a=1;a<=100;a++){if(a%2==0){continue}sum+=a} print sum}'
      2500
    • break [n],退出循环
      ~]# awk 'BEGIN{sum=0;for(a=1;a<=100;a++){if(a==66){break}sum+=a}print sum}'
      2145
  • next
    • 提前结束对本行的处理而直接进入下一行;
      ~]# awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd
  • 关联数组:array[index-expression]

    • Index-expression

      1. 可以使用任何字符串,字符串使用引号(必须加双引号)
      2. 如果某数组元素事先不存在,在引用时,awk 会自动创建元素,并将其值初始化为空值
      • 若要判断数组中,是否存在某元素,要使用“index in array”格式进行
        ~]# awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";print weekdays["tue"]}'
      • 若要遍历数组中每个元素,则要使用 for 循环;

        for(var in array){for-body}

        ~]# awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";for(i in weekdays) print weekdays[i]}'
        
        注意:var会遍历array的每个索引;当索引++时会统计数组中的索引个数;
        ~]# 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
        
        增加访问量:
        ab -c 100 -n 1000 http://172.16.100.9/index.html
        
        统计/etc/fstab文件中每个文件系统类型出现的次数;
        ~]# awk '/^UUID/{fs[$3]++}END{for(i in fs) {print i,fs[i]}}' /etc/fstab 
        
        统计指定文件中每个单词出现的次数;
        ~]# awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count) {print i,count[i]}}' /etc/fstab
  • 内置函数
    • 数值处理: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]}}'
  • 自定义函数

    function f_name(p,q){
    
    ...
    }

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Blockchain Basics

Blockchain Basics

Daniel Drescher / Apress / 2017-3-16 / USD 20.99

In 25 concise steps, you will learn the basics of blockchain technology. No mathematical formulas, program code, or computer science jargon are used. No previous knowledge in computer science, mathema......一起来看看 《Blockchain Basics》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

随机密码生成器
随机密码生成器

多种字符组合密码

SHA 加密
SHA 加密

SHA 加密工具