美文网首页
【linux编程】文本处理-awk

【linux编程】文本处理-awk

作者: leadingsci | 来源:发表于2017-12-26 22:19 被阅读0次

    awk介绍

    awk是Linux及Unix操作系统中非常优秀的数据及文本处理工具,它是一种编程语言。

    特点:

    • 功能强大
    • 完整语法
    • 进程控制
    • 简短高效

    作用

    • 自动化运维
    • 文本处理

    1.awk行处理方式与格式

    • awk内嵌参数应用
    • awk内嵌程序应用

    awk处理方式

    • awk一次处理一行内容
    • awk对每行可以切片处理

    awk格式

    命令行格式
    awk 'command' file(s)

    脚本格式
    awk -f awk-script-file file(s)

    基本格式

    awk 'command' file(s)

    command:pattern{awk操作命令}
    pattern:正则表达式;逻辑判断式

    command1:pattern{awk操作命令}
    操作命令:
    内置函数:print() printf() getline
    控制指令:if() {...}else{...} ; while() (...);

    awk内置变量1

    • $0 : 表示整个当前行
    • $1: 每行第一个字段
    • $2:每行第二个字段
    • $3:每行第三个字段(列)

    awk内置参数:分隔符
    option: -F filed-separator(默认为空格)

    例如:$awk -F ':' '{print $3}'/etc/passwd

    $awk -F ':' '{print $1,$3}' /et/passwd
    或者
    $awk -F ':' '{print $1 $3}' /et/passwd 打印空格
    $awk -F ':' '{print $1 ‘\t' $3}' /et/passwd 打印制表符
    打印第一列,第三列

    $awk -F ':' '{print "User:"$1 "\t" "UID:"$3}' /et/passwd 增加打印字符

    awk内置变量2

    NR:每行的记录号
    NF:字段数量变量

    FILENAME:正在处理的文件名
    例如
    awk -F ‘:’ {print NR,NF}' passwd

    打印行号,字段总数

    awk -F ‘:’ {print FILENAME}' passwd
    打印文件名

    显示/etc/passwd每行的行号,每行的列数,对应行的用户名(print printf)

    使用print的方法
    awk -F ':' '{print "Line:"NR,"Col:NF,"User:"$1}' passwd

    使用printf的方法
    awk -F ':' '{printf("Line:%s Col:%s User:%s\n",NR,NF,$1)}' passwd
    格式大小调整,整齐
    awk -F ':' '{printf("Line:%s Col:%3s User:%s\n",NR,NF,$1)}' passwd

    案例二:

    显示/etc/passwd中用户ID大于100的行号和用户名(if...else...)

    awk -F ':' '{if($3>100) printf("line:%s col:%s user:%s\n",NR,NF,$1)}' passwd

    案例三

    在服务器log中找出Error的方法日期(找到日志文件的Error行,提取第一列)
    awk '/Error/{print $1}' fresh.log


    command:pattern{awk操作命令}

    pattern:正则表达式;逻辑判断式

    awk 逻辑

    ,!: 匹配正则表达式
    ==,~=,<,>: 判断逻辑表达式

    例如
    awk -F ':' '$1~/^m.*/{print $1}' passwd 匹配第一位m的字段,并打印第一个字段

    如man
    mainl
    mooc

    awk -F ':' '$1!~/^m.*/{print $1}' passwd 取反,非m开头的字段

    awk -F ':' '$3>100{print $1,$3}' passwd 找到第三列大于100的行,打印第一列,第三列

    awk -F ':' '$3==100{print $1,$3}' passwd 等于100的行

    awk -F ':' '$3!=100{print $1,$3}' passwd 不等于100的行


    awk的扩展格式

    awk[options] 'command' file(s)

    command2扩展:
    BEGIN{print "start"}pattern{commands} END{print "end"} 在基本格式前加入

    读入行操作前执行,循环执行命令,所有命令运行后,才执行 BEGIN和END不参与循环

    案例:
    制表显示/etc/passwd每行的行号,每行的列数,对应行的用户名
    awk -F ':' ’BEGIN{print "Line Col User"}‘{print NR,NF,$1}END{print "--------------"FILENAME"--------"}' passwd


    案例1

    统计当前文件夹下的文件/文件夹占用的大小
    ls -l | awk 'BEGIN{size=0}{size+=$5}END{print "size is"size}'

    案例2

    统计显示/etc/passwd的账户总人数

    awk -F ':' 'BEGIN{count=0}$1!~/^$/{count++}END{print "count = "count}' /etc/passwd 匹配第一列 去除空行

    统计显示UID大于100的用户名

    判断,按次数追加第一列的nam,遍历打印name
    awk -F ':' 'BEGIN'{count=0}{if ($3>100) name[count++]=$1}END{for (i=0;i<count;i++) print i,name[i])}

    案例3

    统计netstat -anp 状态下为LISTEN和CONNECTED的连接数量

    netstat -anp |awk '$6~/CONNECTED|LISTTEN/{sum[$6]++}END{for (i in sum)print i,sum[i]}'


    awd vs sed比较

    都是处理文本

    awk侧重于复杂逻辑处理

    sed侧重于正则处理

    awk和sed共同使用

    相关文章

      网友评论

          本文标题:【linux编程】文本处理-awk

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