zoukankan      html  css  js  c++  java
  • Linux awk命令详解

    1.awk命令作用
    文本处理工具

    2.awk语法
    awk [选项参数] '{[pattern] action}' {filenames}

    -F fs or –field-separator fs 
    指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:
    
    -v var=value or –asign var=value 
    赋值一个用户定义变量。
    
    -f scripfile or –file scriptfile 
    从脚本文件中读取awk命令。
    
    -mf nnn and -mr nnn 
    对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。
    
    -W compact or –compat, -W traditional or –traditional 
    在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。
    
    -W copyleft or –copyleft, -W copyright or –copyright 
    打印简短的版权信息。
    
    -W help or –help, -W usage or –usage 
    打印全部awk选项和每个选项的简短说明。
    
    -W lint or –lint 
    打印不能向传统unix平台移植的结构的警告。
    
    -W lint-old or –lint-old 
    打印关于不能向传统unix平台移植的结构的警告。
    
    -W posix 
    打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符和=不能代替^和^=;fflush无效。
    
    -W re-interval or –re-inerval 
    允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。
    
    -W source program-text or –source program-text 
    使用program-text作为源代码,可与-f命令混用。
    
    -W version or –version 
    打印bug报告信息的版本。
    

    3.使用示例

    root@iZ238ut6jbcZ:/home/shijingjing# cat log.txt                
    2 this is a test
    3 Are you like awk
    This's a test
    10 There are orange,apple,mongo
    

    1)分割字符串
    awk '{[pattern] action}' {filenames}

    # 每行默认是按章空格或TAB分割的,执行结果如下
    root@iZ238ut6jbcZ:/home/shijingjing# awk '{print $1,$4}' log.txt
    2 a
    3 like
    This's 
    10 orange,apple,mongo
    
    #格式化输出
    root@iZ238ut6jbcZ:/home/shijingjing# awk '{printf "%-8s %-10s
    ", $1,$4}' log.txt
    2        a         
    3        like      
    This's             
    10       orange,apple,mongo
    

    2)-F自定义分隔符
    awk -F #-F指定分割字符

    #-F自定义分隔符
    root@iZ238ut6jbcZ:/home/shijingjing# awk -F, '{print $1,$2}' log.txt
    2 this
    3 Are you like awk 
    
    #使用多个分隔符
    root@iZ238ut6jbcZ:/home/shijingjing# awk -F '[ ,]' '{print $1,$2}' log.txt 
    2 this
    3 Are
    

    3)-v设置变量
    awk -v # 设置变量

    #-v设置变量
    root@iZ238ut6jbcZ:/home/shijingjing# awk -va=1 '{print $1,$1+a}' log.txt
    2 3
    3 4
    This's 1
    10 11
    
    root@iZ238ut6jbcZ:/home/shijingjing# awk -va=1 '{print $1,$(1+a)}' log.txt
    2 this
    3 Are
    This's a
    10 There
    
    root@iZ238ut6jbcZ:/home/shijingjing# awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt   
    2 3 2s
    3 4 3s
    This's 1 This'ss
    10 11 10s
    

    4)表达式

    root@iZ238ut6jbcZ:/home/shijingjing# awk '$1>2' log.txt
    3 Are you like awk
    This's a test
    10 There are orange,apple,mongo
    
    root@iZ238ut6jbcZ:/home/shijingjing# awk '$1>2 && $2=="Are"' log.txt               
    3 Are you like awk
    

    4.内建变量
    1)NR --顺序号

    root@iZ238ut6jbcZ:/home/shijingjing# awk '{print NR,$1,$2}' log.txt          
    1 2 this
    2 3 Are
    3 This's a
    4 10 There
    

    2)OFS --指定输出分割符

    root@iZ238ut6jbcZ:/home/shijingjing# awk '{print $1,$2}' OFS=" $ " log.txt
    2 $ this
    3 $ Are
    This's $ a
    10 $ There
    

    5.正则表达式
    1)输出第二列包含"th",并打印第二列和第四列

    root@iZ238ut6jbcZ:/home/shijingjing# awk '$2 ~ /th/ {print $2,$4}' log.txt               
    this a
    

    ~:模式开始
    //:模式

    2)输出包含"re"的行

    root@iZ238ut6jbcZ:/home/shijingjing# awk '/re/' log.txt                       
    3 Are you like awk
    10 There are orange,apple,mongo
    

    3)忽略大小写

    root@iZ238ut6jbcZ:/home/shijingjing# awk 'BEGIN{IGNORECASE=1} /th/' log.txt    
    2 this is a test
    This's a test
    10 There are orange,apple,mongo
    root@iZ238ut6jbcZ:/home/shijingjing# awk '/th/' log.txt                    
    2 this is a test
    

    4)模式取反

    root@iZ238ut6jbcZ:/home/shijingjing# awk '$2 ~ /th/ {print $2,$4}' log.txt 
    this a
    root@iZ238ut6jbcZ:/home/shijingjing# awk '$2 !~ /th/ {print $2,$4}' log.txt 
    Are like
    a 
    There orange,apple,mongo
    root@iZ238ut6jbcZ:/home/shijingjing# awk '/th/' log.txt                     
    2 this is a test
    root@iZ238ut6jbcZ:/home/shijingjing# awk '!/th/' log.txt
    3 Are you like awk
    This's a test
    10 There are orange,apple,mongo
    

    6.awk脚本
    awk -f {脚本名称} {文件名称}
    awk脚本主要有两个关键字BEGIN,END
    BEGIN{awk语句执行前需要执行的语句}
    END{awk语句执行后需要执行的语句}
    {awk语句执行}

    root@iZ238ut6jbcZ:/home/shijingjing# cat score.txt            
    Marry   2143 78 84 77
    Jack    2321 66 78 45
    Tom     2122 48 77 71
    Mike    2537 87 97 95
    Bob     2415 40 57 62
    

    awk脚本如下:

    #!/bin/awk -f
    # 运行前
    BEGIN{
     math = 0
     english = 0
     computer = 0
     printf "Name  No.   Math English Computer Total
    "
     printf "---------------------------------------
    "
    }
    # 运行中
    {
     math += $3
     english += $4
     computer += $5
     printf "%-6s %-6s %4d %8d %8d %8d
    ",$1, $2, $3, $4, $5, $3+$4+$5
    }
    # 运行后
    END{
     printf "--------------------------------------
    "
     printf "Total:%10d %8d %8d 
    ", math, english, computer
     printf "AVERAGE:%10.2f %8.2f %8.2f
    ", math/NR, english/NR, computer/NR 
    }
    

    运行结果:

    root@iZ238ut6jbcZ:/home/shijingjing# awk -f calc.awk score.txt
    Name  No.   Math English Computer Total
    ---------------------------------------
    Marry  2143     78       84       77      239
    Jack   2321     66       78       45      189
    Tom    2122     48       77       71      196
    Mike   2537     87       97       95      279
    Bob    2415     40       57       62      159
    --------------------------------------
    Total:       319      393      350 
    AVERAGE:     63.80    78.60    70.00
    

    7.其他用法
    1)计算文件大小

    root@iZ238ut6jbcZ:/home/shijingjing# ls -l *.txt
    -rw-r--r-- 1 root root  82 Jul 27 15:41 log.txt
    -rw-r--r-- 1 root root 110 Jul 27 16:26 score.txt
    root@iZ238ut6jbcZ:/home/shijingjing# ls -l *.txt|awk '{sum+=$5} END {print sum}'
    192
    

    2)从文件中找出长度大于20的行

    root@iZ238ut6jbcZ:/home/shijingjing# awk 'length>20' log.txt
    10 There are orange,apple,mongo
    
  • 相关阅读:
    中国石油昆仑加油卡
    157 01 Android 零基础入门 03 Java常用工具类01 Java异常 01 异常介绍 02 异常内容简介
    156 01 Android 零基础入门 03 Java常用工具类01 Java异常 01 异常介绍 01 Java常用工具类简介
    155 01 Android 零基础入门 02 Java面向对象 07 Java多态 07 多态知识总结 01 多态总结
    154 01 Android 零基础入门 02 Java面向对象 07 Java多态 06 内部类 05 匿名内部类
    153 01 Android 零基础入门 02 Java面向对象 07 Java多态 06 内部类 04 方法内部类
    152 01 Android 零基础入门 02 Java面向对象 07 Java多态 06 内部类 03 静态内部类
    151 01 Android 零基础入门 02 Java面向对象 07 Java多态 06 内部类 02 成员内部类
    150 01 Android 零基础入门 02 Java面向对象 07 Java多态 06 内部类概述 01 内部类概述
    149 01 Android 零基础入门 02 Java面向对象 07 Java多态 05 接口(重点)07 接口的继承
  • 原文地址:https://www.cnblogs.com/shijingjing07/p/9378511.html
Copyright © 2011-2022 走看看