awk命令

作者: 缓慢移动的蜗牛 | 来源:发表于2018-04-13 15:11 被阅读0次

    awk的 作用是对文本和数据进行扫描与处理

    awk指令的一些参数说明:

    -F (field-separator fs)  指定以 fs 作为输入行的分隔符(默认分隔符为空格或制表符)
    
    -v var=val    在执行处理过程以前,设置一个变量 var 值为 val
    
    -f program-file  从脚本文件中读取 AWK 指令,以取代在命令参数中输入处理脚本
    
    -W dump-variables[=file]  打印全局变量(变量名、类型、值)到文件中,如果没有提供文件名,则自动输出至名为 dump-variables 的文件中
    

    一个 awk 程序包含一系列的 模式 {动作指令} 或是函数定义
    模式可以是:

    BEGIN
    END
    表达式
    表达式,表达式
    动作指令需要以{}引起来

    简单示例

    test.txt文件内容

    a
    
    b
    
    
    c
    
    d
    
    awk '/^$/ {print "Blank line"}' test.txt
    备注: /^$/通过正则表达式匹配空白行,动作为打印 Blank line;即 test.txt 如有 N 个空白行, awk 将在屏幕打印 N 个 Blank line。
    
    
    awk '/HOSTNAME/' /etc/sysconfig/network
    备注: 打印包含主机名的行,因为没有指定动作指令,默认动作为打印
    
    
    脚本awk.sh的内容是:/^$/ {print "Blank line"}
    awk -f awk.sh test.sh
    备注:提前编辑一个 awk 脚本再通过-f 选项调用该脚本
    

    awk 基本操作

    • 记录与字段

    awk 一次从文件中读取一条记录,并将记录存储在字段变量$0 中。记录被分割为字段并存储在$1,$2 ..., $NF 中(默认使用空格或制表符为分隔符)。

    内建变量 NF 为记录的字段个数

    echo hello the world | awk '{print $1,$2,$3}'
    备注:读取输入行并输出第一个字段,第二个字段,第三个字段
    
    
    echo hello the world | awk '{print $0}'
    备注:读取输入行并输出该行
    
    
    echo hello the world | awk '{print NF}'
    备注:读取输入行并输出该行的字段个数: 3 个字段
    
    
    echo hello the world | awk '{print $NF}'
    备注:读取输入行并输出该行的第三个字段,因为 NF 为 3,所以$NF 等同于取行的最后一个字段
    
    • 字段分隔符

    默认 awk 读取数据以空格或制表符作为分隔符,但可以通过-F 或 FS(field separator)变量> 来改变分隔符

    awk -F: '{print $1}' /etc/passwd
    awk 'BEGIN {FS=":"} {print $1}' /etc/passwd
    备注:以上两个示例均将字段的分隔符改冒号(:),即以冒号为分隔符打印 passwd文件的第一个字段(帐号名称)
    
    
    echo 'hello the:world!' | awk 'BEGIN {FS="[:, ]"} {print $1,$2,$3}'
    备注:指定多个字段分隔符(文档内容为: hello the:word,!)
    
    • 内置变量
    变量名 说明
    ARGC 命令行参数个数
    FILENAME 当前输入文档的名称
    FNR 当前输入文档的当前记录编号,尤其当有多个输入文档时有用
    NR 输入流的当前记录编号
    NF 当前记录的字段个数
    FS 字段分隔符
    OFS 输出字段分隔符,默认为空格
    ORS 输出记录分隔符,默认为换行符\n
    RS 输入记录分隔符,默认为换行符\n

    test1.txt文件内容

    This is a test file.
    Welcome to Jacob's Class.
    

    test2.txt文件内容

    Hello the world.
    Wow! I'm overwhelmed.
    Ask for more.
    

    test3.txt文件内容

    mail from: tomcat@gmail.com
    subject:hello
    data:2012-07-12 17:00
    content:Hello, The world.
    
    mail from: jerry@gmail.com
    subject:congregation
    data:2012-07-12 08:31
    content:Congregation to you.
    
    mail from: jacob@gmail.com
    subject:Test
    data:2012-07-12 10:20
    content:This is a test mail.
    

    示例

    awk '{print FNR}' test1.txt test2.txt
    输出当前文档的当前行编号,第一个文件两行,第二个文件三行
    
    
    awk '{print NR}' test1.txt test2.txt
    备注: awk 将两个文档作为一个整体的输入流,通过 NR 输入当前行编号
    
    
    awk '{print NF}' test1.txt
    备注: test1.txt 文档的第一行有 5 个字段,第二行有 4 个字段
    
    
    awk '{print $1,$2,$3}' test1.txt
    默认 print 输出时,各参数将的输出分隔符默认为空格,所以输出内容如下
    
    
    awk 'BEGIN {OFS="-"} {print $1,$2,$3}' test1.txt
    备注:通过 OFS 将输出分隔符设置为"-",这个 print 在输出第一、二、三个字段时,中间的分隔符为"-"
    
    
    awk 'BEGIN {FS="\n";RS=""}  {print $3}' test3.txt
    读取输入数据,以空白行为记录分隔符,即第一个空白行前的内容为第一个记录,第一个记录中字段分隔符为换行符
    以上 awk 的效果为打印所有的邮件时间,即每个记录的第三个字段
    
    • 表达式与操作符

    表达式是由变量、常量、函数、正则表达式、操作符组成, awk 中变量有字符变量和数字变量。如果在 awk 中定义的变量没有初始化,则初始值为空字串或 0。
    注意:字符操作时一定记得需要加引号

    操作符 含义
    ~ 匹配
    !~ 不匹配

    注:另外的一些操作符与 C 语言类似

    echo 'test' | awk 'x=2 {print x+3}'
    echo 'test' | awk 'BEGIN {OFS="\n"} x=2,y=3 {print x*2,y*3}'
    
    
    awk '/^$/  {print x+=1}' test.txt
    备注:统计所有空白行
    
    awk '/^$/ {x+=1} END {print x}' test.sh
    备注:打印总空白行个数
    
    awk -F: '$1~/root/ {print $3}' /etc/passwd
    备注:打印 root 的 ID号, $1~root:第一个字段要匹配root
    
    
    awk -F: '$3>500 {print $1}' /etc/passwd
    备注:列出计算机中
    ID 号大于 500 的用户名
    

    awk 条件及循环语句

    df | grep "boot" | awk '{if($4<2000)print "Alart";else print "ok"}'
    备注:判断 boot 分区可用容量小于 20M 时报警,否则显示 OK
     
     
    awk 'i=1 {} BEGIN {while (i<=10){++i;print i}}' test.txt
    awk 'BEGIN {do {++x;print x} while (x<=10)}' test.txt
    awk 'BEGIN {for(i=1;i<=10;i++)print i}' test.txt
    

    函数

    • rand () 产生 0-1 之间的浮动类型的随机数
    awk 'BEGIN {print rand();srand(); print srand()}' test.txt
    
    • gsub(x,y,z) 在字串 z 中使用字串 y 替换与正则表达式 x 相匹配的所有字串, z 默认为$0
    awk -F: 'gsub(/root/, "jacob", $0) {print $0}' /etc/passwd
    备注:将 passwd 每行中所有的 root 修改为 jacob 显示至屏幕
    
    • sub(x,y,z) 在字串 z 中使用字串 y 替换与正则表达式 x 相匹配的第一个字串, z 默认为$0
    awk -F: 'sub(/root/,"jacob",$0) {print $0}' /etc/passwd
    备注:将 passwd 每行中第一个 root 修改为 jacob 显示至屏幕
    sub 相当于 sed 中的 s///, gsub 相当于 sed 中的 s///g。
    
    • length(z) 返回字串 z 的长度
    awk '{print length()}' test.txt
    显示 test.txt 文档每行的字符长度
    

    相关文章

      网友评论

          本文标题:awk命令

          本文链接:https://www.haomeiwen.com/subject/gwbckftx.html