zoukankan      html  css  js  c++  java
  • linux中awk的使用

    在linux中awk绝对是核心工具,特别是在查找搜索这一领域,和掌握sed命令一样重要

    下面为awk的一些基本知识,基于这些知识,可以让你随意操控一个文件:

    在awk中:()括号为条件块,{}为执行的命令块

    一般情况下awk有这几部分组成:

    awk 'BEGIN{}(){}END{}' file

    BEGIN为初始化操作,中间为对file文件中每一行的处理,END块中为最后的输出

    当然,awk不是必须这3个都有,也不是缺少谁就不行的。可以只有BEGIN,也可以只有END

    print命令
    打印文件内容
    awk '{print}' datafile

    -f参数
    执行awk脚本,如脚本为hello.awk
    awk -f hello.awk datafile

    $number
    表示记录的字段,其中$0表示整个串

    FS
    表示字段分隔符,如下以逗号作为分隔符
    awk 'BEGIN{FS=","}{print}' datafile
    当写脚本文件时,一般用FS

    -F参数
    同FS作用一样,设置分隔符,如
    awk -F "," '{print $1}' datafile

    NF
    表示当前记录行中的字段数量

    NR
    表示当前记录的编号,即行号

    FNR
    当前浏览文件的记录数

    FS=" +"
    表示以一个或多个制表符作为分隔符

    OFS
    字符分隔符,俩个字段间插入分隔符

    RS
    记录分隔符,即一行的分隔符

    ORS
    输出记录分隔符,俩个记录间(行)插入

    OFMT 数的输出格式

    CONVFMT 数值的内部转换格式

    布尔表达式
    awk -F "," '$1=="Hello" {print $1}' datafile
    只有第一个参数值为Hello时,才打印第二个

    length(string1)
    返回string1长度

    index(string1,string2)
    返回string2在string1中的位置,没有返回0

    tolower(string1)/toupper(string1)
    返回大小写

    substr(string1,5,3)
    从string1的第5位置开始截取长度为3的字段

    match(string1,/you/),RSTART,RLENGTH
    match匹配的是一个正则表达式
    RSTART返回第一个匹配的位置
    RLENGTH指定他占据的字符跨度,没有为-1

    gsub/sub(/My/,"You",string1)
    gsub全局替换,sub只替换第一个
    如上为在string1中查找My并替换为You

    split(string1,strarray,",")
    print strarray[1],strarray[numelements]
    把string1以逗号分割,并传入到strarray组中
    从1开始编号

    删除重复行(必须先排序)
    sort  datafile|awk '{if($0!=line)print;line=$0}'

    FILENAME
    awk中特殊存在,用于表示文件
    awk 'END{print FILENAME}' datafile
    打印file名字
    若有多个输入文件则可以用于判断,如:
    awk 'if(FILENAME=="file1"){arr[$3]=$1}else{($1 in arr){print arr[$1]"|"$2}} file1 file2
    注意:awk先处理前面文件再处理后面文件

    ARGIND
    当前被处理参数标记

    ARGC
    命令行参数个数

    ARGV
    命令行参数排列

    ENVIRON
    支持队列中环境变量的使用

    next
    下一个命令不执行
    awk '(NR%2=1){next}{print}' f1
    awk 'NR==FNR{a[$0]=$0;next}a[$0]{print a[$0],$0}

    nextfile
    中断当前文件处理,进入下个文件处理:
    awk '{print FILENAME;nextfile} f1 f2
    打印俩个文件名,多用于查找文件

    exit
    停止awk,并执行END语句块后退出

    定义函数:
    awk '{print "sum=",sqrtsum($1,$2)}function sqrtsum(x,y){return x*x+y*y}' file
    awk '{print "sum=",$1*$1+$2*$2}

    -v
    加载环境或shell中的参数
    awk-F | -v ORAHOME=${ORA_HOME} '{print $1"|"ORAHOME>"datafile1"} datafile
    或者如下:
    awk-F |  '{print $1"|"ORAHOME>"datafile1"} ORAHOME=${ORA_HOME} datafile

    注:若在BEGIN中使用环境变量,则必须使用-v模式

    getline
    获取文件的行内容,一般放在BEGIN中
    一个getline获取一行,也可以保存到变量
    awk 'BEGIN{getline var1}END{print var1}' file

    打印5行之后的行:
    awk 'NR>5' file
    打印2到6行:
    awk 'NR==2,NR==6' file
    打印前5行:
    awk '!(NR>5)' file
    awk 'NR<6' file
    打印5倍数的行:
    awk '(NR%5==0){print}' file
    awk '!(NR%5){print}' file

    awk中相关操作符使用

    ~操作符
    俩边匹配符,可模糊比较,如:
    awk 'BEGIN{FS="|"}($2~/..My./){print}' file

    表示在第二个字段中包含5个字符,其中第3、4个字符为My的行

    比较运算符
    ==俩边相等
    >
    >=
    <
    <=
    !=俩边不等
    ~ 匹配正则表达式
    !~ 不匹配正则表达式
    ‖逻辑或
    && 逻辑与

    算术运算符
    +      加法
    -       减法
    *      乘法
    /      除法
    ^     指数算法
    %    模算法
    --     自-1(前后自减)
    ++   自+1(前后自加)
    +=    自加算法
    -=      自减算法
    *=      自乘算法
    /=      自除算法
    ^=     自指数算法
    %=    自模算法

    统计文本中空行数量
    awk 'BEGIN{x=0}/^$/{x+=1}END{print x}' datafile
    /^$/表示空行

    正则表达式:
          转义符
    ^      行首符
    $      行尾符
    .        匹配一个字符
    [ ]      匹配其中一个字符
    |        或操作
    ( )     判断语句
    *       匹配0个或多个前面的字符
    +      匹配前面一个或多个字符
    ?      匹配模式出现频率


    if语句
    if($1=="foo"){
        print "foo"
    }else if($1=="bar"){
        print "bar"
    }else{
        print "other"
    }

    do..while语句
    {
    count=6
    do{
         print count
         count--
        }while(count!=1)
    }

    while语句
    {
    while(x<NF){
         print $x
         x++
       }
    }


    for语句
    for(x=1;x<=5;x++){
        print x
    }

    关于本篇内容如有转载请注明出处;技术内容的探讨、纠错,请发邮件到70907583@qq.com
  • 相关阅读:
    KMP算法与字符串匹配问题
    贪婪算法(贪心算法)
    普里姆算法(Prim)与最小生成树问题
    克鲁斯卡尔算法(Kruskal算法)与最小生成树问题
    Dijkstra算法与最短路径问题
    SpringCloud(十一)使用actuator和dashborad、turbine对微服务进行监控
    博客美化——页面白天黑夜切换
    Spring5学习笔记——day01
    Mybatis学习笔记——day06
    Mybatis学习笔记——day05
  • 原文地址:https://www.cnblogs.com/watertaro/p/9221054.html
Copyright © 2011-2022 走看看