Linux awk命令

1.简介
awk 文本分析工具:把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
被分隔符分开后的片段称为域.


2.使用方法
awk '{pattern + action}' {filenames}
pattern就是要表示的正则表达式,用斜杠括起来。
action 是在找到匹配内容时所执行的一系列命令,action{}可以有多个语句,以;号隔开


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


    3.2 shell脚本方式
    将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。
    相当于shell脚本首行的:#!/bin/sh
    可以换成:#!/bin/awk -f
   
    如:print.awk 文件内容如下
    #!/bin/awk -f
    {print $0}
   
    chmod u+x print.awk  赋执行权限
    ./print.awk filename
   


    3.3 将所有的awk命令插入一个单独文件,然后调用:
    awk -f awk-script-file input-file(s)
    其中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。
   
    如:chmod u-x print.awk  取消执行权限
    删除#!/bin/awk -f行
    awk -f print.awk filename
   
    ====> 保存awk输出
    1). 文件重定向  awk -f print.awk filename > outfile
    2). tee命令 即输出到屏幕,同时写入文件 awk -f print.awk filename | tee outfile
    文库参考:
   
http://wenku.baidu.com/link?url=dcyVvm3YleWtzkllnE5l_j7SIDKLCE3YYEjDlLt8NrUQx9u_yzMdwsKDjMcaG3rr1gYKr4H7uq4uMh1QtX-XADHD-dgc_2JFEL7RZ8DHMAS
   
4.命令行方式调用示例
    awk+action的示例:
    cat /etc/passwd |awk  -F ':'  '{print $1}'  显示/etc/passwd的账户
    cat /etc/passwd |awk  -F ':'  '{print $1"\t"$7}'  显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以tab键分割
    cat /etc/passwd |awk  -F ':'  'BEGIN {print "name,shell"}  {print $1","$7} END {print "blue,/bin/nosh"}'
    // awk工作流程是这样的:先执行BEGING,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作。
    ====> 也就是说 BEGIN 后的{}中是开始要执行的命令 , END 后的{}中是结束时要执行的命令。
   
    pattern的使用示例: 匹配了pattern(这里是root)的行才会执行action(没有指定action,默认输出每行的内容)
    awk -F: '/root/' /etc/passwd  搜索/etc/passwd有root关键字的所有行
    =====> root前后的//是正则表达式的边界符
   
    awk -F: '/root/{print $7}' /etc/passwd  搜索/etc/passwd有root关键字的所有行,并显示对应的shell
   
    awk  -F ':'  '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd
    // 统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容
    ====>   $0 代表整条记录


    ***** awk内置变量 *****
            FILENAME awk浏览的文件名
            NR 已读的记录数
            NF 浏览记录的域的个数
           
            ARGC 命令行参数个数
            ARGV 命令行参数排列
            eg: awk -F ":" 'BEGIN {i=0;print "ARGC:" ARGC} {for (;i<ARGC;i++) print "ARGV[" i, "]:" ARGV[i]}' /etc/passwd
            ARGC:2
            ARGV[0 ]:awk
            ARGV[1 ]:/etc/passwd
           
            FNR 浏览文件的记录数
            ===> 对于单文件 NR 和 FNR的输出结果一样
            ===> 对于多个文件,NR 表示awk开始执行后所读取的数据行数,多个文件记录数累计增加。
                    FNR 表示awk当前读取的记录数,相对于当前文件而言
                 所以, NR==FNR:用于在读取两个或两个以上的文件时,判断是不是在读取第一个文件。
   
    awk处理多个文件的基本语法是:
    awk -F分隔符 'BEGIN { 初始化 } { 循环执行部分 } END { 结束处理 }' file_list1 file_list2
           
            FS 设置域分隔符
            RS 控制记录分隔符 
            ===  awk 按照其内建变量RS(Record Separator)的定义将文件中的数据分隔成一行一行的Record.
            ===  RS 默认值是 \n ,即默认 文件的1行就是1个Record
            OFS  输出域分隔符
            ORS  输出记录分隔符


 awk  -F ':'  '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd
 
 awk编程
http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html
 
1. awk 自定义变量
   示例:统计文件行数
   awk -F ':' 'BEGIN {cnt=0; print "beign ...";} {cnt++;} END {print "cnt:" cnt}' /etc/passwd
   beign ...
   cnt:39
2. 条件语句
   if ... else ...
   ls -al | awk 'BEGIN {byte=0;} {if ($5 !=4096){size += $5;}} END {print size "B"}'
   ls -al | awk 'BEGIN {print "beign ..."} {if ($5 !=4096){print $5} else {print "dir"}} END {print "end ..."}'
3. 循环语句
   awk 的循环语句和C语法类似,for , do/while, while ,break,continue

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值