资讯专栏INFORMATION COLUMN

Linux:“awk”命令的妙用

IT那活儿 / 2349人阅读
Linux:“awk”命令的妙用

点击上方“IT那活儿”,关注后了解更多精彩内容!!!



基本用法


awk是一个强大的文本分析工具,简单来说awk就是把文件逐行读入,(空格,制表符)为默认分隔符将每行切片,切开的部分再进行各种分析处理。
1. awk命令格式
awk [-F 分隔符] commands file(s)
[-F 分隔符]是可选的,因为awk使用空格,制表符作为缺省的字段分隔符,因此如果要浏览字段间有空格,制表符的文本,不必指定这个选项,但如果要浏览诸如/etc/test.txt文件,此文件各字段以冒号作为分隔符,则必须指明-F选项。

</>复制代码

  1. echo "this is a test" | awk { print $0 }
    ## 输出为
    this is a test
awk会根据分隔符将行分成若干个字段,$0为整行,$1为第一个字段,$2 为第2个地段,依此类推…
为打印一个字段或所有字段,使用print命令。这是一个awk动作。

</>复制代码

  1. echo "this is a test" | awk { print $1 }
    ## 输出为
    this

    echo "this is a test" |
     awk { print $1, $2 }
    ## 输出为
    this is

    test.txt的文件内容如下
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
2. 举几个简单的小需求
例1 只显示/etc/test.txt的账户:

</>复制代码

  1. awk -F : { print $1 } /etc/test.txt

    ## 输出为
    root
    bin
    daemon
    adm
    lp
例2 示/etc/test.txt的第1列和第7列,用逗号分隔显示,所有行开始前添加列名start1,start7,最后一行添加,end1,end7。

</>复制代码

  1. awk -F : BEGIN {print "start1,start7"} {print $1 "," $7} END {print "end1,end7"} /etc/test.txt

    ## 输出为
    start1,start7
    root,/bin/bash
    bin,/sbin/nologin
    daemon,/sbin/nologin
    adm,/sbin/nologin
    lp,/sbin/nologin
    end1,end7


BEGIN语句在所有文本处理动作执行之前被执行,END在所有文本处理动作执行之后被执行。

例3 统计/etc/test.txt文件中,每行的行号,每行的列数,对应的完整行内容:

</>复制代码

  1. awk -F : { print NR " " NF " " $0 } /etc/test.txt

    ## 输出为
    1    7   root:x:0:0:root:/root:/bin/bash
    2    7   bin:x:1:1:bin:/bin:/sbin/nologin
    3    7   daemon:x:2:2:daemon:/sbin:/sbin/nologin
    4    7   adm:x:3:4:adm:/var/adm:/sbin/nologin
    5    7   lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin



高级用法


1. 支持内置变量
常用内置变量:
  • $n  当前记录的第n个字段,字段间由FS分隔
  • $0  完整的输入记录
  • FILENAME  当前文件名
  • FNR 各文件分别计数的行号
  • FS 字段分隔符(默认是任何空格)
  • NF 一条记录的字段的数目
  • NR 已经读出的记录数,就是行号,从1开始
  • OFS 输出字段分隔符,默认值与输入字段分隔符一致。
  • ORS 输出记录分隔符(默认值是一个换行符)
  • RS 记录分隔符(默认是一个换行符)
2.  支持函数

输出字符串的长度:


</>复制代码

  1. awk BEGIN { print length("this is a text") }
    ## 输出为
    14
将/etc/test.txt的用户名变成大写输出:

</>复制代码

  1. awk -F : { print toupper($1) } /etc/test.txt
    ## 输出为

    ROOT
    BIN
    DAEMON
    ADM
    LP


3. 常用函数
  • toupper(s)返回s的大写
  • tolower(s) 返回s的小写
  • length(s) 返回s长度
  • substr(s,p) 返回字符串s中从p开始的后缀部分
4. 支持条件操作,正则表达式匹配
显示/etc/test.txt中有daemon的行:

</>复制代码

  1. awk -F : $0 ~ /daemon/ /etc/test.txt
    ## 输出为

    daemon:x:2:2:daemon:/sbin:/sbin/nologin


awk条件操作符:

< 、< = 、 == 、 != 、 ~ 匹配正则表达式 、!~ 不匹配正则表达式。
5. 支持流程控制语句,类C语言
if while do/while for break continue
输出第一个字段的第一个字符大于d的行:

</>复制代码

  1. awk -F : { if ($1 > "d") { print $1 } else { print "-" } } /etc/test.txt
    ## 输出为

    root
    -
    daemon
    -
    lp
可以把流程控制语句放到一个脚本中,然后调用脚本执行,如test.sh的内容如下:

</>复制代码

  1. {
    if ($1 > "d") {
    print $1
    } else {
    print "-"
    }
    }
用如下方式执行,效果一样:

</>复制代码

  1. awk -F : -f test.sh /etc/test.txt
    ## 输出为

    root
    -
    daemon
    -
    lp



本 文 原 创 来 源:IT那活儿微信公众号(上海新炬王翦团队)



文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129715.html

相关文章

  • AWK使用简介

    摘要:一简介如何展示文本内容,不在于修改文件,同样也是一行一行读入文件格式选项指明输入时用到的字段分隔符自定义变量模式匹配到相应的行,不标注时匹配整个文件匹配到匹配的行时,所要做的动作。 一:简介 如何展示文本内容,不在于修改文件,同样也是一行一行读入文件格式: awk [options] ‘program’ file option选项: -F 指明输入时用到的字段分隔符 -v ...

    caikeal 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<