• awk的用法


    前言

    awk是一个模式扫描及处理语言.既然是一门语言,那么它就拥有类似于其他编程语言。所以同学们,要学好awk,必须要有shell或其他语言的编程基础,如果你没有编程基础,那么先去建立吧.

    基础语法

    1.awk | -F field-separator| `cmd` input file

       awk -F : `cmd` input file

    2.将awk命令插入一个文件,并使awk程序可以执行,然后用awk命令解释器作为脚本首行。

    3.将所有awk命令插入一个单独文件
       awk -f awk-script-file inputfile

    模式和动作
    模式:两个特殊断 BEGIN和END
    动作:实际动作大多在{}内指明
    域和记录
    浏览域表记为 $1,$2,......$n($1-$n称为域标识)

    例子1:

    需求:对一个文本里的数据进行去重

    awk 'BEGIN{count=0} {if(!a[$0]++)count++} END{print "总共有:"count}'  input file
    

    输出

    1.抽取域

    awk -F: '{print $1}' /etc/passwd
    2.保存输出
    awk -F: '{print $1}' /etc/passwd | tee user
    awk -F: '{print $1}' /etc/passwd >user
    3.使用标准输出
    4.打印所有记录
    awk -F: '{print $0}' /etc/passwd
    5.打印单独记录
    awk -F: '{print $1,$4}' /etc/passwd
    6.打印报告头
    awk -F: 'BEGIN {print "NAME "} {print $1}' /etc/passwd
    7.打印结尾
    awk -F: '{print $1} END {print "this is all users"}' /etc/passwd

    8.打印某一行

    awk '{if(NR==1)print $0}' /etc/passwd

    条件操作符

    1.匹配
    awk '{if($1~/root/) print $0}' /etc/passwd   //{if($1~/root/) print}表示如果field1包含root,打印它//
    2.精确匹配
    使用等号 ==
    3.不匹配
    !~
    4.小于
    if($6 < $7)
    5.小于等于
    6.大于
    7.设置大小写
    awk '/[Rr]oot/' /etc/passwd
    8.任意字符
    awk '$~/^...a/' /etc/passwd      //^...a表示第四个字幕是a//
    9.或关系匹配
    '$0 ~/(root|ftp)/'
    10.行首
    awk '/^48/' input-file       // ^48(行首包含48)
    11.AND &&
    '{if ($1=="P.bunny" && $4=="") print $0}'
    12.OR ||

    内置变量

    ARCC                              命令行参数个数ARGV                          命令行参数排列
    ENVIRON                        支持队列中系统环境变量的使用
    FNR                                 浏览文件的记录数
    FS                                    置顶分隔符,等价于-F
    NF                                    浏览记录的域的个数
    NR                                    已读的记录数
    OFS                                  输出域分隔符
    ORS                                输出记录分隔符
    RS                                   控制记录分隔符

    设置输入域到变量名
    awk -F '{name=$1; pach=$7; if(name~/root/) print name" pach is "pach}' /etc/passwd
    域值比较操作
    awk '{if($6<$7) print $0}' input-file
    修改改数值域取值
    awk ‘{if($1="NAME) $6=$6-1; print$1,$6,$7}' input-file
    修改文本域
    awk ’{if($1="J.Troll") ($1="J.L.Troll); print $1}' input-file
    只显示修改改记录
    awk ’{if($1="J.Troll") {$1="J.L.Troll; print $1}}' input-file
    创建新的输入域
    awk '{if($6>$7) {$8=$6-$7; print $1,$8}' input-file
    增加列值
    awk '(tot=$6) END {print"..................."tot}' input-file
    文件长度相加
    ls -l | awk '/^[^d]/ {print $9" $5} {tot+ =$5} END {print "tltal kb:"tot}'

    内置的字符窜函数

    gsub(r,s)                                                                   在整个$0中用s替代r
    gsub(r,s,t)                                                                 在整个t中用s替代r
    index(s,t)                                                                   返回s中字符串t的第一位置
    length(s)                                                                    返回s长度
    match(s,r)                                                                  测试s中是否包含匹配r的字符串
    split(s,a,fs)                                                                在fs上将s分成序列a
    sub(s, )                                                                      用$0中最左边也是最长的字符串替代

    substr(s,p,n)                                                             返回字符串s中从p开始长度为n的后缀部分
    1.gsub
    awk 'gsub(/4842/,4899) {print $0}' input-file             #/4842/为目标模式   4899为替换模式
    awk 'gsub(/0/,2) {print $0}' /etc/fstab
    awk '{print gsub(/0/,2) $0}' /etc/fstab                        
    2.index查询字符串s中t出现的第一位置
    awk 'BEGIN {print index("root","o")}'
    awk -F: '$1=="root" {print index($1,"o")" "$1}' /etc/passwd
    awk -F: '{print index($1,"o") $1}' /etc/passwd
    3.length
    awk -F: '{print length($1)} /etc/passwd'
    awk 'BEGIN {$1="root" print length($1)'
    4.match (在ANCD中查找C的位置)
    awk 'BEGIN {print match("ANCD" ,/C/)}'
    5.split
    返回字符串数组元素个数
    awk 'BEGIN {print split("123#456#789", myarray, "#")}'
    6.sub 只能替换指定域的第一个0
    awk '{print sub(/0/,"2",$1)' /etc/fstab
    awk '{print sub(/0/,"2",$6)' /etc/fstab
    7.substr 按照起始位置及长度返回字符串的一部分
    awk 'BEGIN {print substr("Pavel.Nedved",7,3)}'
    awk 'BEGIN {print substr("Pavel.Nedved",7)}'
    awk -F: '{print substr($1,3)" " $1)}' /etc/passwd

    字符串屏蔽序列

                                                                    退格键
    f                                                                 走纸换页
                                                                    新行
                                                                     回车
                                                                     tab
    c                                                                任意其他特殊字符
    ddd                                                            八进制
    很简单的例子
    awk -F: '{print $1,""$2," "$3} /etc/passwd

    总结:

    此篇参考刘天斯博客的awk http://blog.liuts.com/post/53/,还有些循环控制的语法请再参考linux的man手册  man awk .

  • 相关阅读:
    WCF中的序列化[下篇]
    WCF中的序列化[上篇]
    SET TRANSACTION ISOLATION LEVEL 详解
    深入探讨数据仓库建模与ETL的实践技巧
    用SQL语句添加删除修改字段等操作
    WCF数据契约与序列化
    在SQL Server中使用检查约束来验证数据
    C#线程同步的几种方法[转]
    Linq的Join用法
    测试wlm代码高亮插件
  • 原文地址:https://www.cnblogs.com/whf191/p/5703757.html
Copyright © 2020-2023  润新知