awk_awk命令详解 - CSDN
信息
操作系统
Linux
开发语言
C/C++
开源协议
GPL
AWK
awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自定义 函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk的处理文本和数据的方 式是这样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。如果没有指定处理动作,则把匹配的行显示到标 准输出(屏幕),如果没有指定模式,则所有被操作所指定的行都被处理。awk分别代表其作者姓氏的第一个字母。因为它的作者是三个人,分别是Alfred Aho、Brian Kernighan、Peter Weinberger。gawk是awk的GNU版本,它提供了Bell实验室和GNU的一些扩展。
收起全文
精华内容
参与话题
  • linux中的awk命令详解

    万次阅读 多人点赞 2018-01-14 14:23:33
    1、AWK简介 AWK是一种处理文本文件的语言,是一个强大的文本分析工具。 2、AWK语法 awk [选项参数] 'script' var=value file(s) 或 awk [选项参数] -f scriptfile var=value file(s) 选项参数的说明: -F ...

    1、AWK简介

    AWK是一种处理文本文件的语言,是一个强大的文本分析工具。

    2、AWK语法

    awk [选项参数] 'script' var=value file(s)
    或
    awk [选项参数] -f scriptfile var=value file(s)
    

    选项参数的说明:

    -F fs or –field-separator fs
    指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:

    -v var=value or –asign var=value
    赋值一个用户定义变量。

    -f scripfile or –file scriptfile
    从脚本文件中读取awk命令。

    -mf nnn and -mr nnn
    对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。

    -W compact or –compat, -W traditional or –traditional
    在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。

    -W copyleft or –copyleft, -W copyright or –copyright
    打印简短的版权信息。

    -W help or –help, -W usage or –usage
    打印全部awk选项和每个选项的简短说明。

    -W lint or –lint
    打印不能向传统unix平台移植的结构的警告。

    -W lint-old or –lint-old
    打印关于不能向传统unix平台移植的结构的警告。

    -W posix
    打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符=不能代替^和^=;fflush无效。

    -W re-interval or –re-inerval
    允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。

    -W source program-text or –source program-text
    使用program-text作为源代码,可与-f命令混用。

    -W version or –version
    打印bug报告信息的版本。

    3、基本用法

    一段文本:cat log.txt

    2 this is a test
    3 Are you like awk
    This's a test
    10 There are orange,apple,mongo
    

    用法一:

    awk ‘{[pattern] action}’ {filenames} # 行匹配语句 awk ” 只能用单引号
    实例:

    # 每行按空格或TAB分割(默认情况),输出文本中的1、4项
    $ awk '{print $1,$4}' log.txt
    ---------------------------------------------
    2 a
    3 like
    This's
    10 orange,apple,mongo
    ---------------------------------------------
    # 格式化输出
    $ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt
    ---------------------------------------------
    2        a
    3        like
    This's
    10       orange,apple,mongo
    

    用法二:

    awk -F #-F相当于内置变量FS, 指定分割字符
    实例:

    # log.txt的内容如下:
    # 2,this,is,a,test
    # 3 Are you like awk    
    $  awk -F, '{print $1,$2}'   log.txt
    ---------------------------------------------
    2 this
    3 Are you like awk
    
    # 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割
    $ awk -F '[ ,]'  '{print $1,$2,$5}'   log.txt
    ---------------------------------------------
    2 this
    3 Are
    

    用法三:

    awk -v # 设置变量
    实例:

    $ awk -va=1 '{print $1,$1+a}' log.txt
    ---------------------------------------------
    2 3
    3 4
    This's 1
    10 11
    $ awk -va=1 '{print $1,$(1+a)}' log.txt
    ---------------------------------------------
    2 this
    3 Are
    This's a
    10 There
    $ awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt
    ---------------------------------------------
    2 3 2s
    3 4 3s
    This's 1 This'ss
    10 11 10s
    

    用法四:

    awk -f {awk脚本} {文件名}

    4、运算符

    过滤第一列大于2的行:

    $ awk '$1>2' log.txt    #命令
    #输出
    3 Are you like awk
    This's a test
    10 There are orange,apple,mongo
    

    过滤第一列等于2的行:

    $ awk '$1==2 {print $1,$3}' log.txt    #命令
    #输出
    2 is
    

    过滤第一列大于2并且第二列等于’Are’的行:

    $ awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt    #命令
    #输出
    3 Are you
    

    5、内建变量

    # 输出顺序号 NR, 匹配文本行号
    $ awk '{print NR,FNR,$1,$2,$3}' log.txt
    ---------------------------------------------
    1 1 2 this is
    2 2 3 Are you
    3 3 This's a test
    4 4 10 There are
    # 指定输出分割符
    $  awk '{print $1,$2,$5}' OFS=" $ "  log.txt
    ---------------------------------------------
    2 $ this $ test
    3 $ Are $ awk
    This's $ a $
    10 $ There $
    

    6、使用正则表达式

    # 输出第二列包含 "th",并打印第二列与第四列
    $ awk '$2 ~ /th/ {print $2,$4}' log.txt
    ---------------------------------------------
    this a
    

    ~ 表示模式开始。// 中是模式。

    # 输出包含"re" 的行
    $ awk '/re/ ' log.txt
    ---------------------------------------------
    3 Are you like awk
    10 There are orange,apple,mongo
    

    忽略大小写:

    $ awk 'BEGIN{IGNORECASE=1} /this/' log.txt
    ---------------------------------------------
    2 this is a test
    This's a test
    

    模式取反:

    $ awk '$2 !~ /th/ {print $2,$4}' log.txt
    ---------------------------------------------
    Are like
    a
    There orange,apple,mongo
    $ awk '!/th/ {print $2,$4}' log.txt
    ---------------------------------------------
    Are like
    a
    There orange,apple,mongo
    

    7、awk脚本

    关于awk脚本,我们需要注意两个关键词BEGIN和END。
    BEGIN{ 这里面放的是执行前的语句 }
    END {这里面放的是处理完所有的行后要执行的语句 }
    {这里面放的是处理每一行时要执行的语句}
    假设有这么一个文件(学生成绩表):

    $ cat score.txt
    Marry   2143 78 84 77
    Jack    2321 66 78 45
    Tom     2122 48 77 71
    Mike    2537 87 97 95
    Bob     2415 40 57 62
    

    awk脚本如下:

    $ cat cal.awk
    #!/bin/awk -f
    #运行前
    BEGIN {
    math = 0
    english = 0
    computer = 0
    
    printf "NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL\n"
    printf "---------------------------------------------\n"
    }
    #运行中
    {
    math+=$3
    english+=$4
    computer+=$5
    printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5
    }
    #运行后
    END {
    printf "---------------------------------------------\n"
    printf "  TOTAL:%10d %8d %8d \n", math, english, computer
    printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR
    }
    

    运行结果:

    $ awk -f cal.awk score.txt
    NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL
    ---------------------------------------------
    Marry  2143     78       84       77      239
    Jack   2321     66       78       45      189
    Tom    2122     48       77       71      196
    Mike   2537     87       97       95      279
    Bob    2415     40       57       62      159
    ---------------------------------------------
      TOTAL:       319      393      350
    AVERAGE:     63.80    78.60    70.00
    

    8、一些其他实例:

    计算文件大小:

    $ ls -l *.txt | awk '{sum+=$6} END {print sum}'
    --------------------------------------------------
    666581
    

    从文件中找出长度大于80的行:

    awk 'length>80' log.txt
    

    打印九九乘法表:

    seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'
    
    展开全文
  • 文章目录前言一些心得历史溯源awk 基本格式awk 执行顺序awk 如何分割语句awk 常用选项参数关键字awk 最基础操作awk 变量awk 运算符awk 条件语句awk 循环语句awk 输入输出语句awk 常用函数awk 注意小细节 awk 前言 我...


    在这里插入图片描述

    前言

    awk 可以说是 linux 运维人员必备的一门语言命令了,而且开发和测试人员也应该掌握它,awk 善于对文本进行处理,理论上可以替代 grep 命令

    我为什么要把 awk 单独拿出来做一篇博文呢?因为 awk 功能确实太强大了,grep 和 sed 相对而言要好掌握不少,awk 其本身就算是一门编程语言,awk 脚本的写法可以说是非常灵活的,理论上可以替代 grep,所以我觉得很有必要将 awk 专门拎出来做一篇学习总结 awk 脚本的博文!

    一些心得

    有的人会认为初学 awk 的时候命令太多,太难记忆了,而且语法规则有些难以理解,其实不然,我们可以用这样的视角去看 awk 命令,我们可以把 awk 这个命令执行脚本的过程看成一个大的 for 循环,且是按行来循环,action 中我们去写对当前行中每一列进行的操作,这样看 awk 就会发现简单了许多,另外 awk 多了一个模式匹配的东西,这个模式匹配我们就直接看成遍历到当前行,里头写的一个条件语句即可,再另外 BEGIN 语句和 END 语句分别看成在 for 循环开头和 for 循环结束后的操作即可。很简单对吧!

    历史溯源

    awk 为什么叫做 awk 呢?因为其命名源于三位大佬的名字首字母:Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符,这几位是 awk 工具的创始人

    awk 基本格式

    # 直接依进行 awk 命令操作
    awk [option] 'pattern{action}' var=value file(s)
    
    # 可以依据文件中的 awk 命令脚本进行操作,-f 指定 awk 脚本的文件
    awk [option] -f scriptfile var=value file(s)
    

    awk 执行顺序

    我们先看一个例子

    # 写法一
    awk '{FS=":"} {pirnt $1}'
    
    # 写法二
    awk 'BEGIN{FS=":"} {pirnt $1}'
    
    # 写法三
    awk -F ':' '{print $1}'
    

    写法一我们认为它是按照:做分割输出第一列,实际上并不是,写法二才是正确的。那为什么会导致这种情况的产生呢?因为在没有指定 BEGIN 变量的时候,awk 命令会先去读取第一行数据,它不会管你的 FS 设置为多少,awk 命令的底层操作顺序就是先直接去读取第一行数据,使用默认空格分隔符,然后发现命令中有 FS 分割,但已经读取了第一行改不了分割的规则了,所以第一行直接打印,然后从第二行开始分割都是正常的了。

    所以我们明白一个道理就是像 FS 这类改变 awk 行数据排列规则的命令应该在前面带上 BEGIN,让其在读取第一行之前就应该被处理到!

    用写法三也是正确的

    awk 的大致流程就是逐行处理,把行作为赋值给 $0,然后将 $0 按照默认空格符做切分,切分为 $1, $2, $3...,然后执行编程动作,最后输出到屏幕

    awk 如何分割语句

    awk 基本分隔样式

    # awk 选项 '模式语句{动作语句}'
    awk [option] 'pattern{action}'
    

    awk 自成一门编程语言,语句的分隔是有特点的。涉及到''{},这些符号,我们总结出特点有以下三点:

    • 1.被 {}包裹的是 awk 的 action 动作,也就是说下面 awk 的各种语法放在{}才能被 awk 语法编译执行,{}中被识别为 awk 的语法
    • 2.{}中,awk 的脚本语句之间需要用;隔开,这一点与其他编程语言类似
    • 3.{}外,单引号内的空间是模式语句,模式可以直接做真假值的判定,不用加 if 语句,比如NR==1,awk 会逐行进行的判定,当 awk 遍历到该行的时候,若此条件判定为真,就会输出该行相应的数据,否则不输出

    基本形式如下:

    # 组合语句
    {statements;...}
    
    # 基本写法
    awk '{if(condition1) {statements1;...} else if(condition2) {statements2;...} else{statements;...}}' test.log
    
    # 基本写法,这里 statements 可以代表 if else 的表达式
    awk '{statements1; statements2; if(condition) {statements3;...}}' test.log
    
    # 基本形式,{} 外面可以直接写条件
    awk 'condition {statments;}'
    

    awk 模式匹配语句

    常用的比如说NR==1这种形式,模式匹配语句是真假值的判定,还可以使用正则,如下:

    ~!~

    ~表示匹配某个正则,!~则表示不匹配

    # 匹配第一列为 xxx 的所有行,并输出行号
    awk '$1~/xxx/ {print NR}' test.log
    
    # 匹配第一列不为 xxx 的所有行,并输出行号
    awk '$1!~/xxx/ {print NR}' test.log
    

    !和有!

    !表示整行匹配某个正则,有!表示整行不匹配某个正则

    # 输出匹配 xxx 的行的行号
    awk '/xxx/ {print NR}' test.log
    
    # 输出不匹配 xxx 的行的行号
    awk '!/xxx/ {print NR}' test.log
    

    注意上面两者相互对比

    这里还要不得不提及到的一点就是,awk 的模式匹配例如$1~/xxx/其中 xxx 支持扩展正则,这一点和 sed 是有区别的,sed 需要加上-r才表示支持扩展正则,而且 sed 可以使用#代替/,但是 awk 这里就不行了,这是和 sed 的明显区别

    awk 常用选项参数关键字

    选项

    # 指定分隔符
    -F
    awk -F ':' '{print $1}' test.log
    # 指定 awk 的脚本文件
    -f
    awk -f awkfile.sh test.log
    # 设置变量
    -v
    awk -v 'a=1' '{print a}' test.log
    # 忽略大小写
    IGNORECASE=1
    # 行号
    NR
    # 列数
    NF
    # 记录分隔符,也就是 awk 默认是以回车符作为一行行读取的证据,记录分隔符是做这个的
    RS
    # 被识别的字段分隔符
    FS
    # 输出的字段分隔符
    OFS
    

    关键字

    # awk 开始与结束执行
    BEGIN
    END
    # exit 后可以接上参数作为后序 awk 状态信息的输入。跳出 awk
    exit
    # 在当前这个关键字处立即停止并进入下一行
    next
    

    awk 最基础操作

    # 打印第一列
    awk '{print $1}' test.log
    
    # 格式化打印第一列第二列
    awk '{print $1,\t,$2}' test.log
    
    # 打印第一行
    awk 'NR==1 {print $0}' test.log
    
    # 打印匹配到数字的行的行号和第一列
    awk '/[0-9]/ {print NR,$1}' test.log
    
    # 打印第一列匹配到数字的行
    awk '$1~/[0-9]/ {print $0}' test.log
    
    # 不匹配数字的行
    awk '!/[0-9]/ {print $0}' test.log
    
    # 设置 : 为分隔符
    awk -F ':' '{print $1}' test.log
    awk 'BEGIN{FS==":"} {print $1}' test.log
    
    # 多重分割,用空格和逗号做分给,逻辑上是先用空格分隔,之后空格里在用逗号分隔
    awk -F '[ ,]' '{print $1,$2}' test.log
    
    # 不区分大小写匹配
    awk 'BEGIN{IGNORECASE=1} /aaa/' test.log
    
    # 输出 0-1 的随机数
    echo | awk '{srand(); print rand()}'
    

    awk 变量

    对于没有声明的变量,awk 会直接赋予其初值 0,字符串则赋予初值空字串,这是一个特点需要记住

    数字,字符串 awk 有常见的数字类型,字符串类型,还有内置变量比如 NR 这些

    数组 awk 的数组也蛮有意思,awk 支持关联数组这种数据结构,形式上和普通数组写法一致,但是效果上更像是 java 中的 map 这种结构,因为 awk 中的关联数组的下标可以是字串

    # 声明
    a["aaa"]+=$1;
    b[$2]=1;
    # 删除整个数组
    delete a;
    # 删除某个数组元素
    delete b[$2];
    

    多维数组 至于多维数组 awk 本身是不支持的,所以我们只能用一维数组去模拟多维数组

    awk 运算符

    # 比较运算符
    < <= > >= == !=
    # 支持赋值运算符
    = += -= *= /= %= ^=
    # 三元运算符
    ?:
    # 常规运算符
    + - * / %
    # 逻辑运算符
    && || ! 
    # 加加与减减
    ++ --
    # 匹配正则表达式和不匹配正则表达式
    ~ !~
    # 变量引用
    $
    # 数组成员
    in
    

    awk 条件语句

    awk 支持 if 语句。基本形式如下:

    # if 语句
    if(condition) {statements;...}
    # if else 语句
    if(condition) {statements1;...} else{statements2;...}
    # if elseif else 语句
    if(condition1) {statements1;...} else if(condition2) {statements2;...} else {statements3;...}
    

    awk 循环语句

    awk 支持 for 和 while 循环语句。基本形式如下:

    # for 语句
    for(expr1;expr2;expr3) {statements;...}
    # for in 语句
    for(arg in arr) {statements;...}
    # while 语句
    while(condition) {statements;...}
    # do while 语句
    do{statements;...} while(condition)
    
    # 跳出与继续 for while 循环
    break
    continue
    

    awk 输入输出语句

    输入语句

    # 通过 -f 指定 awk 脚本文件来源
    awk -f [FILE] test.log
    

    输出语句

    # print 直接打印
    awk '{print $0}' test.log
    # printf 格式化打印
    awk '{printf "%s\t%s\n",$1,$2}' test.log
    
    # 浮点
    %f
    # 单个字符
    %c
    # 字符串
    %s
    # 有符号整型
    %d
    # 自动选择合适表示法
    %g
    

    awk 常用函数

    内置函数

    # 求开方
    sqrt(arg)
    # 截断取整
    int(arg)
    # 函数作用是把 rand() 函数种子置为 srand() 的参数,若没有参数,则参数是某天一个时间。返回的先前的随机种子,默认初始的随机种子是 1。简要概括就是 srand(arg) 是设置随机种子返回之前的随机种子
    srand()
    srand(seed)
    # 随机数产生,rand() 生成 0-1 随机数,不设置 srand() 则随机种子是 1,rand() 起不到随机效果,输出 rand() 是固定值
    srand(arg) 后再执行 rand()
    
    # 字符串替换,将原字符串(第三个参数)中的某个正则匹配到的字符串(第一个参数)替换成某个字符串(第二个参数)
    sub(regx,segmentStr,originStr)
    # 字符串截取
    substr(str,num1,num2)
    # 返回第一次匹配到的下标
    index(segmentStr,originStr)
    # 长度方法
    length(arg)
    # 分割成数组
    split(str,arr,分割符)
    # 转化为小写
    tolower(str)
    # 转化为大写
    toupper(str)
    
    # 返回 1970/1/1 到目前的整秒数
    systime()
    

    自定义函数

    举个小例子

    awk '{\
            function addition(num1, num2){\
                result=num1+num2;\
                return result;\
            }\
            BEGIN{\
                res=addition(10,20);\
                print "10 + 20 = " res;\
            }\
    }' test.log
    

    awk 坑人小细节

    • 我在实际中测试发现,我们通过 -F 指定分隔符的时候,如果分隔符是空格,则会默认按照贪婪模式去匹配,即去查找最长的空格作为分隔符,若我们指定其他符号作为分隔符,比如说英文字母,则它会以非贪婪模式去匹配,即遇到一个就作为分隔符
    • 前面我们讲解了如果把 awk 的模式匹配看成 awk 循环每一行中的条件语句,把 BEGIN 和 END 看成 awk 遍历整个文本之前和之后的内容,awk 的模式匹配语句是用来做真假值的判断的,如果读到该行模式匹配是真就输出,假就不输出,但是要注意的是这种写法是错误不允许的就是模式匹配后面加上了 END{},模式匹配后要么是空的,要么是 {},不能跟上 END{},下面举出正确例子
      # 正确写法!!!!
      awk 'NR==1'
      awk 'BEGIN{...} NR==1'
      awk 'BEGIN{...} NR==1 {...}'
      awk 'BEGIN{...}'
      awk 'END{...}'
      awk 'NR==1 {...} END{...}'
      
      这下面是错误写法:
      awk 'NR==1 END{...}' 这是有问题的!!!
      
    • 在使用 RS 指定行的分隔符时要注意如果我们不使用\n作为换行符号,那么 awk 在遍历到最后一行末尾时会自动输出一个换行!我们看看下面的例子:
      在这里插入图片描述
      这一点巨坑
    展开全文
  • awk详解

    万次阅读 多人点赞 2018-08-19 17:08:27
    awk是linux中处理文本的强大工具,或者说是一种专门处理字符串的语言,它有自己的编码格式。awk的强大之处还在于能生成强大的格式化报告。 awk的命令格式如下: 其中常用选项有 -F、-f等选项,后面会介绍。 ...

    awk是linux中处理文本的强大工具,或者说是一种专门处理字符串的语言,它有自己的编码格式。awk的强大之处还在于能生成强大的格式化报告。
    awk的命令格式如下:
    这里写图片描述
    其中常用选项有 -F、-f等选项,后面会介绍。
    例如

    >awk -F: '{print $1}' file

    表示把file文件中每行数据以“:”分割后,打印出第一个字段。下面详细介绍使用方式。
    以下示例如不做说明,均用file文件为例,file文件中数据为:

    The dog:There is a big dog and a little dog in the park
    The cat:There is a big cat and a little cat in the park
    The tiger:There is a big tiger and a litle tiger in the park

    一、数据字段变量

    awk把分割后的数据字段自动分配给数据字段变量

    • $0表示整行文本
    • $1表示文本行中第一个数据字段
    • $2表示文本行中第二个数据字段
    • $n表示文本行中第n个数据字段
    root@lzj-virtual-machine:/home/lzj/demo# awk -F: '{print $2}' file
    There is a big dog and a little dog in the park
    There is a big cat and a little cat in the park
    There is a big tiger and a litle tiger in the park

    通过选项-F指定“:”为字段分隔符,把每行数据分为两段,然后输出第二个数据字段$2。

    awk  '{print $2}' file

    如不显示指定字段分隔符,awk的默认字段分隔符为任意空白字符,包括制表符、空格符、换行符等。

    二、在脚本中使用多个命令

    上一个示例在program命令脚本中只使用了一个print命令,如果使用多个命令,则在每个命令之间加分号。

    root@lzj-virtual-machine:/home/lzj/demo# awk -F: '{$1="Description:"; print $0}' file
    Description: There is a big dog and a little dog in the park
    Description: There is a big cat and a little cat in the park
    Description: There is a big tiger and a litle tiger in the park

    用冒号进行分割字段,然后把第一个字段替换为“Description:”,最后打印出整行数据。

    三、从文件中读程序命令

    如果program程序命令过多,可以单独放在一个文件中,然后从文件中读命令。还是以上面为例,把

    {
    $1="Description:"
    print $0
    }

    单独放在一个文件script1中。再用awk处理脚本时,需要用选项 -f 指定脚本程序的位置。

    root@lzj-virtual-machine:/home/lzj/demo# awk -F: -f script1 file
    Description: There is a big dog and a little dog in the park
    Description: There is a big cat and a little cat in the park
    Description: There is a big tiger and a litle tiger in the park

    四、在处理数据之前运行脚本

    awk默认每次读入一行数据,然后用脚本进行处理。如果想在处理文本之前预处理一些命令,可以用BEGIN关键字指定。

    root@lzj-virtual-machine:/home/lzj/demo# awk -F: 'BEGIN{print "开始处理..."}{print $2}' file
    开始处理...
    There is a big dog and a little dog in the park
    There is a big cat and a little cat in the park
    There is a big tiger and a litle tiger in the park

    五、在处理数据后运行脚本

    用END关键字在处理完所有数据后,再运行善后处理工作。

    root@lzj-virtual-machine:/home/lzj/demo# awk -F: '{print $2} END{print "处理结束..."}' file
    There is a big dog and a little dog in the park
    There is a big cat and a little cat in the park
    There is a big tiger and a litle tiger in the park
    处理结束...

    六、在program中使用变量

    变量又分为两种形式:awk内置的变量;用户自定义的变量。
    【1】、内置变量
    1. 与记录分隔符相关变量
    - FS :输入字段分隔符
    - OFS:输出字段分隔符
    - RS:输入记录分割符
    - ORS:输出字段分隔符
    - FIELDWIDTHS:定义数据字段的宽度

    FS用法

    root@lzj-virtual-machine:/home/lzj/demo# awk 'BEGIN{FS=":"} {print $1, $2}' file
    The dog There is a big dog and a little dog in the park
    The cat There is a big cat and a little cat in the park
    The tiger There is a big tiger and a litle tiger in the park

    用FS指定字段分隔符为“:”,然后用“:”把每行数据分割为两段。

    OFS用法
    前面例子没有指定OFS,输出时默认数据字段之间用空格分开。

    root@lzj-virtual-machine:/home/lzj/demo# awk 'BEGIN{FS=":"; OFS=">"} {print $1, $2}' file
    The dog>There is a big dog and a little dog in the park
    The cat>There is a big cat and a little cat in the park
    The tiger>There is a big tiger and a litle tiger in the park

    用FS指定输入字段分隔符“:”后,每行数据分为两个数据段,输出时,用OFS指定两个数据字段用“>”拼接。

    RS和ORS用法
    默认情况下RS和ORS设置为“\n”,表示输入数据流中的每一行作为一条记录,输出时每条记录之间也以“\n”进行分割。
    下面以file2文件为例,fiel2文件中内容如下:

    Tom is a student
    and he is 20 years old
    
    Bob is a teacher
    and he is 40 years old

    默认情况下,每行作为一条记录处理,但此种情况下,要把第一行和第二行作为一条记录处理,第三行和第四行作为一条记录处理。

    root@lzj-virtual-machine:/home/lzj/demo# awk 'BEGIN{RS=""; ORS="\n"; FS="and"; OFS=","} {print $1, $2}' file2
    Tom is a student
    , he is 20 years old
    Bob is a teacher
    , he is 40 years old

    2、与数据分割段有关的变量

    ARGC    命令行参数个数
    ARGV    命令行参数数组
    FILENAME    当前输入文件的名字
    IGNORECASE  如果为真,则进行忽略大小写的匹配
    ARGIND  当前被处理文件的ARGV标志符
    CONVFMT 数字转换格式 %.6g
    ENVIRON UNIX环境变量
    ERRNO   UNIX系统错误消息
    FIELDWIDTHS 输入字段宽度的空白分隔字符串
    FNR 文件的当前记录数
    NR 已处理的输入记录数
    NF 数据文件中数据字段的个数
    OFMT    数字的输出格式 %.6g
    RSTART  被匹配函数匹配的字符串首
    RLENGTH 被匹配函数匹配的字符串长度

    下面介绍几个常用的
    ARGC和ARGV
    ARGC表示命令行中的参数个数,ARGV是参数数组

    root@lzj-virtual-machine:/home/lzj/demo# awk -F: '{print ARGC, ARGV[0], ARGV[1]}' file
    2 awk file
    2 awk file
    2 awk file

    可见,每处理一行数据时,都是两个参数,第一个是awk本身,第二个是处理的文件名

    NF
    NF表示数据文件中数据字段的个数,可以通过$NF获取最后一个数据字段

    root@lzj-virtual-machine:/home/lzj/demo# awk -F: '{print NF, $NF}' file
    2 There is a big dog and a little dog in the park
    2 There is a big cat and a little cat in the park
    2 There is a big tiger and a litle tiger in the park

    每行记录数据通过“:”分割都有两个数据字段。

    NR和FNR
    FNR表示处理文件的当前记录号,NR表示所有处理文件已处理的输入记录个数。

    root@lzj-virtual-machine:/home/lzj/demo# awk -F: '{print "NR="NR, "FNR="FNR, $2}' file file1
    NR=1 FNR=1 There is a big dog and a little dog in the park
    NR=2 FNR=2 There is a big cat and a little cat in the park
    NR=3 FNR=3 There is a big tiger and a litle tiger in the park
    NR=4 FNR=1 There is a big dog and a little dog in the forest
    NR=5 FNR=2 There is a big cat and a little cat in the forest
    NR=6 FNR=3 There is a big tiger and a litle tiger in the forest

    注意,不要对NR和FNR加$,例如,如果对NR加$,加入NR等于5,实际就是取每条记录的第5个数据字段,实际没有这么多,只能取到空。

    【2】、用户自定义变量
    1、在脚本中使用用户自定义变量
    建立一个script1的脚本,内容如下:

    awk '
    BEGIN{
        FS = ":"
        name = "lzj>"
    }
    {
        $1 = name
        print $0
    }' file

    运行该脚本 ./script

    root@lzj-virtual-machine:/home/lzj/demo# ./script1
    lzj> There is a big dog and a little dog in the park
    lzj> There is a big cat and a little cat in the park
    lzj> There is a big tiger and a litle tiger in the park

    在脚本中直接定义了一个name变量,在脚本程序中可以直接引用该变量。注意在shell命令中,赋值语句“=”的前后是不能有空格的,但是在awk程序的内部是可以有的,因为awk是一种单独的编程语言。

    2、在命令行中使用变量
    首先定义一个script2脚本,其内容为:

    BEGIN{
    FS = ":"
    }
    {
        print $n
    }

    脚本中有一个n的变量,在命令行中传入

    root@lzj-virtual-machine:/home/lzj/demo# awk -f script2 n=2 file
    There is a big dog and a little dog in the park
    There is a big cat and a little cat in the park
    There is a big tiger and a litle tiger in the park

    注意一个问题:在命令行中传入的参数,默认在BEGIN是不能获取的,例如
    script2脚本改为如下,在BEGIN部分获取n的值:

    BEGIN{
    FS = ":"
    print "请输出第二部分...", n
    }
    {
        print $n
    }
    root@lzj-virtual-machine:/home/lzj/demo# awk -f script2 n=2 file
    请输出第二部分... 
    There is a big dog and a little dog in the park
    There is a big cat and a little cat in the park
    There is a big tiger and a litle tiger in the park

    运行命令,发现BEGIN部分的n值并没有打印出来。
    但是如果用-v选项指定,并且把变量放在脚本代码之前,在BEGIN部分就可以访问了

    root@lzj-virtual-machine:/home/lzj/demo# awk -v n=2 -f script2 file
    请输出第二部分... 2
    There is a big dog and a little dog in the park
    There is a big cat and a little cat in the park
    There is a big tiger and a litle tiger in the park

    可以看到在BEGIN部分访问到了n的值2

    七、在脚本中使用数组

    1、数组赋值与查询
    awk脚本中的数组有两种使用方式,一种是像其它高级语言一样,用数字下标来索引;另一种是用字典的key值来索引,key必须唯一。
    新建script3脚本,内容为:

    awk '
    BEGIN{
        arr["dog"] = "DOG"
        arr["cat"] = "CAT"
        print arr["cat"]
    }' file
    root@lzj-virtual-machine:/home/lzj/demo# ./script3 
    CAT

    2、数组递归
    新建脚本script4,内容为:

    echo "hello" | awk '
    BEGIN{
        arr["a"] = "A"
        arr["b"] = "B"
        arr["c"] = "C"
    }
    {
        for(var in arr)
        {
            print arr[var]
        }
    }'

    运行该脚本

    root@lzj-virtual-machine:/home/lzj/demo# ./script4 
    A
    B
    C

    注意,有时数组的顺序是不一致的。
    3、删除数组元素
    修改script4脚本,增加delete语句

    echo "hello" | awk '
    BEGIN{
        arr["a"] = "A"
        arr["b"] = "B"
        arr["c"] = "C"
    }
    {
        delete arr["c"]
        for(var in arr)
        {
            print arr[var]
        }
    }'

    运行脚本

    root@lzj-virtual-machine:/home/lzj/demo# ./script4 
    A
    B

    可见删除了C元素。

    八、脚本中使用正则匹配模式

    在脚本中用正则匹配数据行时,正则表达式一定要放在脚本命令的左大括号之前,例如

    $awk 'BEGIN{FS = ":"} /dog/{print $2}' file

    匹配所有数据行中带dog字符的。

    1、用~匹配特定数据字段
    用正则表达式匹配指定的数据字段,匹配成功的,就是脚本要处理的数据。

    root@lzj-virtual-machine:/home/lzj/demo# awk -F: '$1 ~ /^The cat$/{print $2}' file
    There is a big cat and a little cat in the park

    数据行中的第一个数据字段满足以The开头,cat结尾的数据行,执行后面的脚本。示例可知只有一条数据行满足记录。

    当然也可以通过匹配的否定形式(!~)来排除数据行

    root@lzj-virtual-machine:/home/lzj/demo# awk -F: '$1 !~ /dog/{print $2}' file
    There is a big cat and a little cat in the park
    There is a big tiger and a litle tiger in the park

    2、使用数学表达式
    可以在匹配数据行时用数学表达式。
    以处理file3文件为例,文件内容为:

    1:This is 1 line
    2:This is 2 line
    3:This is 3 line
    4:This is 4 line
    root@lzj-virtual-machine:/home/lzj/demo# awk -F: '$1 % 2 == 0{print $2}' file3
    This is 2 line
    This is 4 line

    匹配第一个数据字段除2余0的数据行记录。
    数学表达式中的+、-、*、/、^(平方)等都可以应用。
    另外数学表达式不仅可以用在匹配部分,还可以用在BEGIN、program命令脚本、END部分。
    常用的数学比较大小的表达式如下:
    这里写图片描述

    注意,如果要比较文本的话,只能用“==”进行比较

    root@lzj-virtual-machine:/home/lzj/demo# awk -F: '$1 == "The cat"{print $2}' file
    There is a big cat and a little cat in the park

    九、awk中使用结构化命令

    1、if结构
    格式为:

    if(condition){
        statement1
        statement2
        .....
    }else
    {
        statement3
        ......  
    }

    新建script5脚本,如果,每个数据行包括两个数据字段就执行if条件。

    awk -F: '{
    if(NF == 2)
    {
        print $1
        print $2
    }else
    {
        pring NF
    }
    }' file
    

    运行脚本

    root@lzj-virtual-machine:/home/lzj/demo# ./script5 
    The dog
    There is a big dog and a little dog in the park
    The cat
    There is a big cat and a little cat in the park
    The tiger
    There is a big tiger and a litle tiger in the park

    2、while循环结构
    格式

    while(condition)
    {
        statement1
        statement2
        ... 
    }

    新建script6脚本,计算10以内的奇数和

    echo "hello" | awk '
    {
        total = 0
        i = 1
        while(i < 10)
        {
            if(i % 2 == 0)
            {
                i++
                continue
            }
            total = total + i
            i++
        }
        print "total=", total
    }'
    

    运行脚本

    root@lzj-virtual-machine:/home/lzj/demo# ./script6
    total= 45

    3、for循环
    结构

    for(variable addignment; condition; iteration peocess)
    {
        statement1
        statement2
        ...
    }

    修改上一示例,改为for循环结构,求10以内奇数的和

    echo "hello" | awk '
    {
        total = 0
        for(i=1; i<10; i++)
        {
            if(i % 2 == 0)
            {
                continue
            }
            total = total + i
        }
        print "total=", total
    }'

    结果与上一示例相同。
    注意:在awk的for和while循环中也支持breake、continue。

    十、awk内置函数

    数学函数
    这里写图片描述

    字符串函数
    这里写图片描述

    位操作函数
    这里写图片描述

    时间函数
    这里写图片描述

    十一、用户自定义函数

    用户自定义函数一定要放在调用之前进行定义
    格式

    function function_name([variable])
    {
        statement1
        statement2
        ....
    }

    例如处理file4文件,内容如下,只提取其中姓名和电话

    Bob NanjingRoad 6623432
    Terry BeijingRoad 6689764
    Lily GuangzRoad 6623678

    新建脚本script7,内容如下

    awk '
    function fshow() 
    {
        printf "%-5s : %s\n", $1, $3
    }
    BEGIN{
        print "开始处理..."
    }
    {
        fshow() 
    }' file4

    运行脚本如下

    root@lzj-virtual-machine:/home/lzj/demo# ./script7 
    开始处理...
    Bob   : 6623432
    Terry : 6689764
    Lily  : 6623678

    注意:
    printf的用法通C语言一样;
    在脚本中BEGIN后面一定要紧跟“{”,否则会出错。

    参考:linux脚本教程宝典

    展开全文
  • 我们先来用专业的术语描述一下awk是什么,如果你看不懂,没关系,我们会再用"大白话"解释一遍。 awk是一个报告生成器,它拥有强大的文本格式化的能力,这就是专业的说法。你可能不理解所谓的报告生成器中...

    我们先来用专业的术语描述一下awk是什么,如果你看不懂,没关系,我们会再用"大白话"解释一遍。

     

    awk是一个报告生成器,它拥有强大的文本格式化的能力,这就是专业的说法。

    你可能不理解所谓的报告生成器中的"报告"是什么,你可以把"报告"理解为"报表"或者"表格",也就是说,我们可以利用awk命令,将一些文本整理成我们想要的样子,比如把一些文本整理成"表"的样子,然后再展示出来,刚才概念中提到的"文本格式化的能力",也就是这个意思,其实这样说可能还是不太容易理解,不用着急,当你看到后面的"示例"时,自然会明白awk所擅长的"文本格式化"能力是什么。

     

    awk从放弃到入门(1):awk基础 (通俗易懂,快进来看)

    awk是由Alfred Aho 、Peter Weinberger 和 Brian Kernighan这三个人创造的,awk由这个三个人的姓氏的首个字母组成。

    awk早期是在unix上实现的,所以,我们现在在linux的所使用的awk其实是gawk,也就是GNU awk,简称为gawk,awk还有一个版本,New awk,简称为nawk,但是linux中最常用的还是gawk。

    awk从放弃到入门(1):awk基础 (通俗易懂,快进来看)

    awk其实是一门编程语言,它支持条件判断、数组、循环等功能。所以,我们也可以把awk理解成一个脚本语言解释器。

     

    grep 、sed、awk被称为linux中的"三剑客"。

    我们总结一下这三个"剑客"的特长。

    grep 更适合单纯的查找或匹配文本

    sed  更适合编辑匹配到的文本

    awk  更适合格式化文本,对文本进行较复杂格式处理

     

    此处,我们只总结 awk

     
     

    awk基础

    awk基本语法如下,看不懂没关系,我们会慢慢举例。

    awk [options] 'program' file1 , file2 , ```

    对于上述语法中的program来说,又可以细分成pattern和action,也就是说,awk的基本语法如下

    awk [options] 'Pattern{Action}' file

     

    从字面上理解 ,action指的就是动作,awk擅长文本格式化,并且将格式化以后的文本输出,所以awk最常用的动作就是print和printf,因为awk要把格式化完成后的文本输出啊,所以,这两个动作最常用。

     

    我们先从最简单用法开始了解awk,我们先不使用[options] ,也不指定pattern,直接使用最简单的action,从而开始认识awk,示例如下

    awk从放弃到入门(1):awk基础 (通俗易懂,快进来看)

    上图中,我们只是使用awk执行了一个打印的动作,将testd文件中的内容打印了出来。

     

    好了,现在,我们来操作一下另一个类似的场景。

    awk从放弃到入门(1):awk基础 (通俗易懂,快进来看)

    上图中的示例没有使用到options和pattern,上图中的awk '{print $5}',表示输出df的信息的第5列,$5表示将当前行按照分隔符分割后的第5列,不指定分隔符时,默认使用空格作为分隔符,细心的你一定发现了,上述信息用的空格不止有一个,而是有连续多个空格,awk自动将连续的空格理解为一个分割符了,是不是比cut命令要简单很多,这样比较简单的例子,有利于我们开始了解awk。

     

    awk是逐行处理的,逐行处理的意思就是说,当awk处理一个文本时,会一行一行进行处理,处理完当前行,再处理下一行,awk默认以"换行符"为标记,识别每一行,也就是说,awk跟我们人类一样,每次遇到"回车换行",就认为是当前行的结束,新的一行的开始,awk会按照用户指定的分割符去分割当前行,如果没有指定分割符,默认使用空格作为分隔符。

    awk从放弃到入门(1):awk基础 (通俗易懂,快进来看)

     
     

    $0 表示显示整行 ,$NF表示当前行分割后的最后一列($0和$NF均为内置变量)

    注意,$NF 和 NF 要表达的意思是不一样的,对于awk来说,$NF表示最后一个字段,NF表示当前行被分隔符切开以后,一共有几个字段。

    也就是说,假如一行文本被空格分成了7段,那么NF的值就是7,$NF的值就是$7,  而$7表示当前行的第7个字段,也就是最后一列,那么每行的倒数第二列可以写为$(NF-1)。

     
     

    我们也可以一次输出多列,使用逗号隔开要输出的多个列,如下,一次性输出第一列和第二列

    awk从放弃到入门(1):awk基础 (通俗易懂,快进来看)

    同理,也可以一次性输出多个指定的列,如下图

    awk从放弃到入门(1):awk基础 (通俗易懂,快进来看)

    我们发现,第一行并没有第5列,所以并没有输出任何文本,而第二行有第五列,所以输出了。

     
     

    除了输出文本中的列,我们还能够添加自己的字段,将自己的字段与文件中的列结合起来,如下做法,都是可以的。

    awk从放弃到入门(1):awk基础 (通俗易懂,快进来看)

    从上述实验中可以看出,awk可以灵活的将我们指定的字符与每一列进行拼接,或者把指定的字符当做一个新列插入到原来的列中,也就是awk格式化文本能力的体现。

     

    但是要注意,$1这种内置变量的外侧不能加入双引号,否则$1会被当做文本输出,示例如下

    awk从放弃到入门(1):awk基础 (通俗易懂,快进来看)

    我们也可以输出整行,比如,如下两种写法都表示输出整行。

    awk从放弃到入门(1):awk基础 (通俗易懂,快进来看)

    我们说过,awk的语法如下

    awk [options] 'Pattern{Action}' file

    而且我们说过awk是逐行处理的, 刚才已经说过了最常用的Action:print

    现在,我们来认识下一Pattern,也就是我们所说的模式

    不过,我们准备先把awk中最特殊的模式展示给大家,以后再介绍普通的模式,因为普通模式需要的篇幅比较长,所以我们先来总结特殊模式。

    AWK 包含两种特殊的模式:BEGIN 和 END。

    BEGIN 模式指定了处理文本之前需要执行的操作:

    END 模式指定了处理完所有行之后所需要执行的操作:

    什么意思呢?光说不练不容易理解,我们来看一些小例子,先从BEGIN模式开始,示例如下

    awk从放弃到入门(1):awk基础 (通俗易懂,快进来看)

    上述写法表示,在开始处理test文件中的文本之前,先执行打印动作,输出的内容为"aaa","bbb".

    也就是说,上述示例中,虽然指定了test文件作为输入源,但是在开始处理test文本之前,需要先执行BEGIN模式指定的"打印"操作

    既然还没有开始逐行处理test文件中的文本,那么是不是根本就不需要指定test文件呢,我们来试试。

    awk从放弃到入门(1):awk基础 (通俗易懂,快进来看)

    经过实验发现,还真是,我们并没有给定任何输入来源,awk就直接输出信息了,因为,BEGIN模式表示,在处理指定的文本之前,需要先执行BEGIN模式中指定的动作,而上述示例没有给定任何输入源,但是awk还是会先执行BEGIN模式指定的"打印"动作,打印完成后,发现并没有文本可以处理,于是就只完成了"打印 aaa bbb"的操作。

    这个时候,如果我们想要awk先执行BEGIN模式指定的动作,再根据执我们自定义的动作去操作文本,该怎么办呢?示例如下

    awk从放弃到入门(1):awk基础 (通俗易懂,快进来看)

    上图中,蓝色标注的部分表示BEGIN模式指定的动作,这部分动作需要在处理指定的文本之前执行,所以,上图中先打印出了"aaa bbb",当BEGIN模式对应的动作完成后,在使用后面的动作处理对应的文本,即打印test文件中的第一列与第二列,这样解释应该比较清楚了吧。

    看完上述示例,似乎更加容易理解BEGIN模式是什么意思了,BEGIN模式的作用就是,在开始逐行处理文本之前,先执行BEGIN模式所指定的动作。以此类推,END模式的作用就一目了然了,举例如下。

    awk从放弃到入门(1):awk基础 (通俗易懂,快进来看)

    聪明如你一定明白了,END模式就是在处理完所有的指定的文本之后,需要指定的动作。

    那么,我们可以结合BEGIN模式和END模式一起使用。示例如下

    awk从放弃到入门(1):awk基础 (通俗易懂,快进来看)

    上述示例中返回的结果有没有很像一张"报表",有"表头"  、"表内容"、  "表尾",awk对文本的格式化能力你体会到了吗?

     

    展开全文
  • Linux中awk工具的使用

    万次阅读 多人点赞 2018-10-12 22:01:31
    awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,默认以空格为分隔符将每行切片,切开的部分再进行各种分析处理。 ...
  • awk和sed命令详解

    千次阅读 2017-03-31 21:45:44
    1、awk命令 awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。 awk命令形式: awk [-F|-f|-v] 'commands' ...
  • sed sed 是一种在线的、非交互式的编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送...
  • sed 详解

    2019-08-08 07:24:04
    sed命令详解1.sed -n '2'p filename打印文件的第二行。2.sed -n '1,3'p filename打印文件的1到3行3. sed -n '/Neave/'p filename打印匹配Neave的行(模糊匹配)4. sed -n '4,/The/'p filename在第4行查询模式The5....
  • Linux awk和sed命令详解

    2017-12-04 17:13:08
    http://blog.csdn.net/SeeTheWorld518/article/details/48630271
  • AWK命令详解 sed命令详解 AWK命令详解 sed命令详 AWK命令详解 sed命令详解解
  • linux awk命令详解

    千次阅读 2019-01-29 18:19:59
    awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息 awk处理过程: 依次对每一行进行处理,然后输出 awk命令形式: awk [-F|-f|-v] ‘BEGIN{} //...
  • awk 打印行号和整行数据

    万次阅读 2013-11-20 10:05:42
    awk '{print NR}' filename;
  • shell 里 awk print 的用法

    万次阅读 2020-01-22 11:14:05
    shell 里 awk print 的用法 备忘:shell 里 awk print 的用法
  • awk if 使用方法

    万次阅读 2018-07-31 22:42:50
    awk if 使用方法 例如筛选tcp中接受或发送的有堆积的链接情况: $ netstat -tanp | awk '{if ($2 &amp;gt; 0 || $3 &amp;gt; 0) print $0}' Active Internet connections (servers and established) Proto...
  • awk if else if else

    万次阅读 多人点赞 2017-02-14 09:36:12
    awk 功能强大,可以处理文本,筛选需要的信息,这里不再多说,有兴趣的可以上网搜,我在这里只讲awk 怎样使用if else。 在网上查了好久,在shell使用awk 的 if else if else 时,网上给的列子是这样的:awk '{if ($...
  • awk对某列进行筛选

    万次阅读 2016-04-21 15:39:05
    cat revenue_20160420.upd | awk -F"\t" '$4寻找第四列小于负100的行数
  • awk删除文件的某一列

    万次阅读 2016-11-15 10:51:55
    cat file |awk ' { $5=null;print $0 }'
  • awk按照多个分隔符进行分割

    万次阅读 2014-07-03 14:46:42
    我们知道awk可以进行类似于cut之类的操作,ru
  • awk模式开关中多条件判断

    万次阅读 2016-08-16 23:35:35
    4 li li二、脚本内容测试脚本(AWK语法和C语言类似)内容如下: 其中第一个awk中模式开关条件判断为: $2!="zhao" && $2!="qian"; 第二个awk中模式开关条件判断为:$2=="zhao" || $2=="qian"。#测试awk模式开关...
  • awk求和、平均值、最大小值

    万次阅读 2019-03-14 14:11:36
    cat data|awk '{sum+=$1} END {print "Sum = ", sum}' 2、求平均 cat data|awk '{sum+=$1} END {print "Average = ", sum/NR}' 3、求最大值 cat data|awk 'BEGIN {max = 0} {if ($1&...
1 2 3 4 5 ... 20
收藏数 174,094
精华内容 69,637
关键字:

awk