zoukankan      html  css  js  c++  java
  • 三剑客-awk

    awk常用命令选项
    -F fs fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:
    -v var=value 赋值一个用户定义变量,将外部变量传递给awk
    -f scripfile 从脚本文件中读取awk命令
    -m[fr] val 对val值设置内在限制,-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。

    awk的原理

    第一步:执行BEGIN{ commands }语句块中的语句;
    第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
    第三步:当读至输入流末尾时,执行END{ commands }语句块。

    BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。

    END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。

    pattern语句块中的通用命令是最重要的部分,它也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块。

    awk的基本用法

    awk的调用有三种方式
    1.命令行方式
    awk [-F field-separator] 'commands' input-file(s)
    其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。
    在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。

    2.shell脚本方式
    awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file
    一个awk脚本通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块3部分组成,这三个部分是可选的。任意一个部分都可以不出现在脚本中,脚本通常是被单引号或双引号中,例如:

    awk 'BEGIN{ i=0 } { i++ } END{ print i }' filename
    awk "BEGIN{ i=0 } { i++ } END{ print i }" filename

    3.将所有的awk命令插入一个单独文件,然后调用

    awk -f awk-script-file input-file(s)
    其中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的命令行方式是一样的。
    我们通过几个简单的示例来进一步了解awk的用法

    awk工作流程是这样的:读入有' '换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是"空白键" 或 "[tab]键",所以$1表示登录用户,$3表示登录用户ip,以此类推。如

    打印/etc/passwd下所有的用户名
    [root@localhost ~]# awk -F: '{print $1}' /etc/passwd
    root
    bin
    daemon
    adm
    ........................................................................
    打印/etc/passwd下所有的用户名及UID
    [root@localhost ~]# awk -F: '{print $1,$3}' /etc/passwd
    root 0
    bin 1
    daemon 2

    [root@localhost ~]# awk -F: '{print "username: " $1 "		uid: "$3}' /etc/passwd
    username: root      uid: 0
    username: bin       uid: 1
    username: daemon        uid: 2
    awk内置变量
    变量描述
    $n 当前记录的第n个字段,字段间由FS分隔
    $0 完整的输入记录
    ARGC 命令行参数的数目
    ARGIND 命令行中当前文件的位置(从0开始算)
    ARGV 包含命令行参数的数组
    CONVFMT 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组
    ERRNO 最后一个系统错误的描述
    FIELDWIDTHS 字段宽度列表(用空格键分隔)
    FILENAME 当前文件名
    FNR 各文件分别计数的行号
    FS 字段分隔符(默认是任何空格)
    IGNORECASE 如果为真,则进行忽略大小写的匹配
    NF 一条记录的字段的数目
    NR 已经读出的记录数,就是行号,从1开始
    OFMT 数字的输出格式(默认值是%.6g)
    OFS 输出记录分隔符(输出换行符),输出时用指定的符号代替换行符
    ORS 输出记录分隔符(默认值是一个换行符)
    RLENGTH 由match函数所匹配的字符串的长度
    RS 记录分隔符(默认是一个换行符)
    RSTART 由match函数所匹配的字符串的第一个位置
    SUBSEP 数组下标分隔符(默认值是/034)

    awk -F: '{tmp=$1;$1=$NF;$NF=tmp;print}' /etc/passwd
    awk -F: '{tmp=$1;$1=$NF;$NF=tmp;print $0}' /etc/passwd

    awk -F: '{tmp=$1;$1=$NF;$NF=tmp}1' /etc/passwd

    '找谁{干啥}'
    '条件{动作}'
    条件:是否成立 非0
    动作: {print $0}


    awk -F: -vOFS=: '{tmp=$1;$1=$NF;$NF=tmp}1' /etc/passwd
    awk -vFS=OFS=: '{tmp=$1;$1=$NF;$NF=tmp}1' /etc/passwd

    sed -r 's#(^[^:]+)(.*:)(.*$)#321#g' /etc/passwd


    [root@m01 server]# awk 'BEGIN{print ARGV[1],ARGV[2]}' oldboy oldgirl
    oldboy oldgirl

    [root@m01 server]# awk 'BEGIN{print ARGV[0],ARGV[1],ARGV[2]}' oldboy oldgirl
    awk oldboy oldgirl

    找出/etc/passwd中第3列以数字1-5开头的行
    [root@m01 server]# awk -F: '$3~/^[1-5]/' /etc/passwd

    awk数组 

    [root@m01 server]# awk -F'[/.]+' '{array[$2]++}END{for(n in array)print n}' url.txt
    www
    mp3
    post
    [root@m01 server]# awk -F'[/.]+' '{array[$2]++}END{for(n in array)print n,array[n]}' url.txt
    www 3
    mp3 1
    post 2

    统计 access.log 中每分钟每个ip的访问次数

    echo 101.226.61.184 [22/Nov/2015:11:02:00|awk '{substr($2,2,17)}'
    echo 101.226.61.184 [22/Nov/2015:11:02:00|awk '{print substr($2,2,17)}'
    #gsub()
    #substr()
    awk '{time=substr($2,2,17);arr[$1" "time]++}END{for(i in arr)print i,arr[i]}' time.log

     
  • 相关阅读:
    邮件收件与草稿箱sql
    [转]全局变量与全局静态变量的区别:
    工作:8月份6-14号的工作初级经验(零碎) 关于传值id经常犯的错误
    网络婚礼之AFNetWorking3.0
    网络热恋之NSURLSession
    网络热恋之json解析
    网络热恋之SDWebImage
    网络热恋之XML解析
    网络&热恋NSURLConnection代理及GET¥POST请求
    网络邂逅&网络异步请求
  • 原文地址:https://www.cnblogs.com/fangdecheng/p/9960656.html
Copyright © 2011-2022 走看看