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
    
  • 相关阅读:
    超出范围样式...
    CSS 滚动条设置
    js 数组全包含
    vue字段为空过滤器
    window.open 打开的新页签会携带sessionStorage中的数据
    ES6的解构赋值与深拷贝和浅拷贝
    vue中怎么处理多个单选框,且单选框互不影响的方案
    h5项目中关于ios手机软键盘导致页面变形的完美解决方案
    vue项目中关于微信分享的坑,以及安卓和ios获取location.href不同的处理
    navicat连接mysql报错1251的解决方法
  • 原文地址:https://www.cnblogs.com/shijingjing07/p/9378511.html
Copyright © 2011-2022 走看看