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

    AWK是一种处理文本文件的语言,是一个强大的文本分析工具。之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符

    awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

    使用方法 : awk '{pattern + action}' {filenames}

    awk内置变量:

    $n            当前记录的第n个字段,字段间由FS分隔
    $0            完整的输入记录
    ARGC        命令行参数的数目
    ARGIND        命令行中当前文件的位置(从0开始算)
    ARGV        包含命令行参数的数组
    CONVFMT        数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组
    ERRNO        最后一个系统错误的描述
    FIELDWIDTHS    字段宽度列表(用空格键分隔)
    FILENAME    当前文件名
    FNR            各文件分别计数的行号
    FS            设置输入域分隔符,等价于命令行 -F选项
    IGNORECASE    如果为真,则进行忽略大小写的匹配
    NF            一条记录的字段的数目
    NR            已经读出的记录数,就是行号,从1开始
    OFMT        数字的输出格式(默认值是%.6g)
    OFS            输出记录分隔符(输出换行符),输出时用指定的符号代替换行符
    ORS            输出记录分隔符(默认值是一个换行符)
    RLENGTH        由match函数所匹配的字符串的长度
    RS            记录分隔符(默认是一个换行符)
    RSTART        由match函数所匹配的字符串的第一个位置
    SUBSEP        数组下标分隔符(默认值是/034)
    $NF是number finally,表示最后一列的信息,跟变量NF是有区别的,变量NF统计的是每行列的总数

    format格式:

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

    修饰符:

    N:显示宽度,N为数字
    -:左对齐,默认为右对齐
    +:显示数值符号
    	 制表符 
    
     换行符 
    ~ 匹配,与==相比不是精确比较 
    !~ 不匹配,不精确比较 
    == 等于,必须全部相等,精确比较 
    != 不等于,精确比较 
    &&  逻辑与 
    || 逻辑或 
    + 匹配时表示1个或1个以上 
    /[0-9][0-9]+/ 两个或两个以上数字 
    /[0-9][0-9]*/ 一个或一个以上数字 

    awk 列输出:

    1.搜索/etc/passwd有root关键字的所有行

    [root@127-0-0-1 scripts]# awk '/root/' /etc/passwd                   
    root:x:0:0:root:/root:/bin/bash

    2.搜索/etc/passwd有root关键字的所有行,并输出shell列

    [root@127-0-0-1 scripts]# awk -F  ":" '/root/ {print $7}' /etc/passwd
    /bin/bash
    /sbin/nologin

    3.统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容

    [root@127-0-0-1 scripts]# awk -F ":" '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd
    filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash
    filename:/etc/passwd,linenumber:2,columns:7,linecontent:bin:x:1:1:bin:/bin:/sbin/nologin
    filename:/etc/passwd,linenumber:3,columns:7,linecontent:daemon:x:2:2:daemon:/sbin:/sbin/nologin
    filename:/etc/passwd,linenumber:4,columns:7,linecontent:adm:x:3:4:adm:/var/adm:/sbin/nologin
    filename:/etc/passwd,linenumber:5,columns:7,linecontent:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    filename:/etc/passwd,linenumber:6,columns:7,linecontent:sync:x:5:0:sync:/sbin:/bin/sync
    filename:/etc/passwd,linenumber:7,columns:7,linecontent:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    filename:/etc/passwd,linenumber:8,columns:7,linecontent:halt:x:7:0:halt:/sbin:/sbin/halt
    filename:/etc/passwd,linenumber:9,columns:7,linecontent:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    filename:/etc/passwd,linenumber:10,columns:7,linecontent:uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
    filename:/etc/passwd,linenumber:11,columns:7,linecontent:operator:x:11:0:operator:/root:/sbin/nologin
    filename:/etc/passwd,linenumber:12,columns:7,linecontent:games:x:12:100:games:/usr/games:/sbin/nologin
    filename:/etc/passwd,linenumber:13,columns:7,linecontent:gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
    filename:/etc/passwd,linenumber:14,columns:7,linecontent:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    filename:/etc/passwd,linenumber:15,columns:7,linecontent:nobody:x:99:99:Nobody:/:/sbin/nologin
    filename:/etc/passwd,linenumber:16,columns:7,linecontent:dbus:x:81:81:System message bus:/:/sbin/nologin
    filename:/etc/passwd,linenumber:17,columns:7,linecontent:vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
    filename:/etc/passwd,linenumber:18,columns:7,linecontent:abrt:x:173:173::/etc/abrt:/sbin/nologin
    filename:/etc/passwd,linenumber:19,columns:7,linecontent:saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
    filename:/etc/passwd,linenumber:20,columns:7,linecontent:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    filename:/etc/passwd,linenumber:21,columns:7,linecontent:haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
    filename:/etc/passwd,linenumber:22,columns:7,linecontent:ntp:x:38:38::/etc/ntp:/sbin/nologin
    filename:/etc/passwd,linenumber:23,columns:7,linecontent:sshd:x:74:74::/var/empty/sshd:/bin/false
    filename:/etc/passwd,linenumber:24,columns:7,linecontent:zabbix:x:498:498:Zabbix Monitoring System:/var/lib/zabbix:/bin/bash
    filename:/etc/passwd,linenumber:25,columns:7,linecontent:ntop:x:497:497:ntop:/var/lib/ntop:/sbin/nologin
    filename:/etc/passwd,linenumber:26,columns:7,linecontent:tcpdump:x:72:72::/:/sbin/nologin
    filename:/etc/passwd,linenumber:27,columns:7,linecontent:dev:x:500:500::/home/dev:/bin/bash
    filename:/etc/passwd,linenumber:28,columns:7,linecontent:ops:x:501:501::/home/ops:/bin/bash
    filename:/etc/passwd,linenumber:29,columns:7,linecontent:qa:x:502:502::/home/qa:/bin/bash
    filename:/etc/passwd,linenumber:30,columns:7,linecontent:bigdata:x:503:503::/home/bigdata:/bin/bash
    filename:/etc/passwd,linenumber:31,columns:7,linecontent:test:x:504:504::/home/test:/bin/bash
    filename:/etc/passwd,linenumber:32,columns:7,linecontent:autobots:x:505:505::/home/autobots:/bin/bash
    filename:/etc/passwd,linenumber:33,columns:7,linecontent:netdata:x:496:496:netdata:/opt/netdata:/sbin/nologin
    filename:/etc/passwd,linenumber:34,columns:7,linecontent:mysql:x:506:506:MySQL Server:/home/mysql:/bin/bash
    filename:/etc/passwd,linenumber:35,columns:7,linecontent:gluster:x:495:495:GlusterFS daemons:/var/run/gluster:/sbin/nologin
    filename:/etc/passwd,linenumber:36,columns:7,linecontent:apache:x:48:48:Apache:/var/www:/sbin/nologin
    filename:/etc/passwd,linenumber:37,columns:7,linecontent:mysql-proxy:x:494:494:MySQL-Proxy user:/:/sbin/nologin

    4.打印/etc/passwd/的第二行信息

    [root@127-0-0-1 scripts]# awk 'NR==2{print "filename:" FILENAME,$0}' /etc/passwd   
    filename:/etc/passwd bin:x:1:1:bin:/bin:/sbin/nologin

    5.获取第12到30行的第一列的信息

    [root@127-0-0-1 scripts]# awk -F ":" '{if(NR > 12 && NR < 30) print $1}' /etc/passwd
    gopher
    ftp
    nobody
    dbus
    vcsa
    abrt
    saslauth
    postfix
    haldaemon
    ntp
    sshd
    zabbix
    ntop
    tcpdump
    dev
    ops
    qa

    6.多分隔符的使用,多个分隔符利用[]然后在里面写分隔符即可

    [root@127-0-0-1 scripts]# cat yoon.txt 
    192.168.1.1:3307
    
    [root@127-0-0-1 scripts]# awk -F '[.:]' '{print $1,$5}' yoon.txt  
    192 3307

    7.添加了BEGIN和END

    hello world
    [root@127-0-0-1 scripts]# cat long.txt 
    2 this is a test
    3 Are you like awk
    This's a test
    10 There are orange,apple,mongo
    
    [root@127-0-0-1 scripts]# cat long.txt | awk 'BEGIN{print "name,shell"} {print $1,$NF} END {print "hello world"}'
    name,shell
    2 test
    3 awk
    This's test
    10 orange,apple,mongo
    hello world

    8.忽略大小写

    [root@127-0-0-1 scripts]# awk 'BEGIN{IGNORECASE=1} /this/' long.txt 
    2 this is a test
    This's a test

    9.使用正则,字符串匹配

    输出第二列包含 "th",并打印第二列与第四列

    [root@127-0-0-1 scripts]# awk '$2 ~ /th/ {print $2,$4}' long.txt 
    this a

    10.输出第二列不包含 "th",并打印第二列与第四列

    [root@127-0-0-1 scripts]# awk '$2 !~ /th/ {print $2,$4}' long.txt
    Are like
    a 

    11.匹配包含27为数字开头的行,如27,277,2777...

    awk '/[2][7][7]*/{print $0}' /etc/passwd            匹配包含27为数字开头的行,如27,2772777...

    12.awk自定义输出

    awk  '{print $1 $3}'  part01           //$1与$3相连输出,不分隔
    awk  '{print $1,$3}'  part01           //多了一个逗号,$1与$3使用空格分隔
    awk  '{print $1 " " $3}'  part01     //$1与$3之间手动添加空格分隔

    13.awk对字段数量做判断的输出

    awk  '{print $NF}' part01           //将每行第NF个字段的值打印出来
    awk  'NF==4 {print }' part01        //显示只有4个字段的行
    awk  'NF>2{print $0}' part01        //显示每行字段数量大于2的行

    14.awk对行的处理

    awk '{print NR,NF,$NF,"	",$0}' part01 //依次打印行号,字段数,最后字段值,制表符,每行内容
    awk 'NR==5{print}'   part01               //显示第5行
    awk 'NR==5 || NR==6{print}'   part01      //显示第5行和第6行
    awk 'NR!=1{print}'   part01             //不显示第一行

    15.匹配字符处理

    //纯字符匹配   !//纯字符不匹配   ~//字段值匹配    !~//字段值不匹配   ~/a1|a2/字段值匹配a1或a2 
    awk  '/mail/,/mysql/{print}' /etc/passwd         //区间匹配
    awk  '/[2][7][7]*/{print $0}' /etc/passwd            //匹配包含27为数字开头的行,如27,277,2777...
    awk  '$1~/mail/{print $1}' /etc/passwd           //$1匹配指定内容才显示
    awk  '{if($1~/mail/) print $1}' /etc/passwd      //与上面相同
    awk  '$1!~/mail/{print $1}' /etc/passwd          //不匹配

    16.IF语句,必须用在{}中,且比较内容用()扩起来

    awk  '{if($1~/mail/) print $1}' /etc/passwd                                       //简写
    awk  '{if($1~/mail/) {print $1}}'  /etc/passwd                                   //全写
    awk  '{if($1~/mail/) {print $1} else {print $2}}' /etc/passwd            //if...else...

    17.条件表达式 == != > >=

    awk  '$1=="183.198.46.6"{print $4}' part01 
    awk  '{if($1=="mysql") print $3}' /etc/passwd          //与上面相同 
    awk  '$1!="mysql"{print $3}' /etc/passwd               //不等于
    awk  '$3>1000{print $3}' /etc/passwd                   //大于
    awk  '$3>=100{print $3}' /etc/passwd                   //大于等于
    awk  '$3<1{print $3}' /etc/passwd                      //小于
    awk  '$3<=1{print $3}' /etc/passwd                     //小于等于

    18.逻辑运算符 && ||

    awk  '$1~/183.198.46.6/ && $4~/2015:19:14:40/ {print$7}' part01
    awk  '$1~/mail/ && $3>8 {print }' part01 //逻辑与,$1匹配mail,并且$3>8
    awk  '{if($1~/mail/ && $3>8) print }' /etc/passwd
    awk  '$1~/mail/ || $3>1000 {print }' /etc/passwd       //逻辑或
    awk  '{if($1~/mail/ || $3>1000) print }' /etc/passwd 

    19.数值运算

    awk  '$3 > 100' /etc/passwd    
    awk  '$3 > 100 || $3 < 5' /etc/passwd  
    awk  '$3+$4 > 200' /etc/passwd
    awk  '/mysql|mail/{print $3+10}' /etc/passwd   //第三个字段加10打印 
    awk  '/mysql/{print $3-$4}' /etc/passwd       //减法
    awk  '/mysql/{print $3*$4}' /etc/passwd       //求乘积
    awk  '/MemFree/{print $2/1024}' /proc/meminfo   //除法
    awk  '/MemFree/{print int($2/1024)}' /proc/meminfo    //取整

    20.格式化输出

    awk '{printf "%-8d %-8s %-10s
    ",$1,$2,$3}' part01
    printf表示格式输出
    %格式化输出分隔符,-8长度为8个数字,s表示字符串类型,打印每行前三个字段,指定第一个字段输出字符串类型(长度为8),第二个字段输出字符串类型(长度为8),第三个字段输出字符串类型(长度为10)
  • 相关阅读:
    Java实现One-way traffic(单向交通)
    Java实现One-way traffic(单向交通)
    Java实现One-way traffic(单向交通)
    Java实现One-way traffic(单向交通)
    C#调用Delphi Dll返回字符串的示例(使用Move才能拷贝字符串)
    Delphi实现菜单项上出现提示
    WebBrowser中获得脚本中的变量值
    比较两个文件是否相同(比较两个流是否相等)
    WebBrowser执行脚本和调用外部方法
    c#之函数创建和闭包
  • 原文地址:https://www.cnblogs.com/hankyoon/p/12680120.html
Copyright © 2011-2022 走看看