您的位置:新葡亰496net > 电脑系统 > grep三大shell文本处理工具之awk的应用,awk常用基

grep三大shell文本处理工具之awk的应用,awk常用基

发布时间:2019-09-23 03:48编辑:电脑系统浏览(67)

    一门语言,过滤内容(专长取列)

    awk

    一、awk命令

    awk是一种编制程序语言,用于在linux/unix下对文件和数据举行拍卖(gawk - pattern scanning and processing language)。centos7中的awk是gawk的链接。它帮衬客户自定义函数和动态正则表明式等先进功能,是linux/unix下的一个强有力编制程序工具。前面包车型大巴grep、sed只是单独的工具,而awk已经是一门语言了,可知awk的功效将相比较强硬

    用法:
    awk -F '分割暗号' ‘script’ files
    awk [options] 'script' var=value file(s)
    awk [options] -f scriptfile var=value file(s)

    选项:
    -F fs fs钦命输入分隔符,fs能够是字符串或正则说明式,如-F:
    -v var=value 赋值三个顾客定义变量,将表面变量传递给awk
    -f scripfile 从剧本文件中读取awk命令

    Awk

      -F "[, ]"  多分隔符

    1、是什么
    是三个编程语言。帮衬变量、数组、函数、流程序调节制(if...else/for/while)
    单行程序语言。

    二、对文本竖列的操作

    awk命令能够方便的通过点名分隔暗号将文件分成特定的列,然后在针对分出来的竖列举办操作

    1、展现test.txt文书档案的第一列前5行。

    awk -F ':' '{print $1}' test.txt | head -n 5

    命令解释:-F ':' 正是说那个文件以:作为分隔符,我们抓好验的是passwd文件,它自个儿就被:分割成了7段,'{}'中正是操作的汇报,命令中的print $1 就是显得第1列。

    图片 1

    2、呈现test.txt文件全数竖列的剧情

    awk -F ':' '{print $0}' test.txt
    awk '{print $0}' test.txt

    专一与上一条命令的界别,$1代表第一列,$0表示全部列。
    图片 2

    效果上实在和cat同样。

    3、awk也可以
    awk命令在一贯不点名-F 分割符号或分割字符串时,暗中同意以空格只怕空白段作为分隔符

    大家先成立二个测量检验文书档案,以空格作为分隔符
    图片 3

    后我们输入下列命令

    awk '{print $1}'
    awk '{print $1,$3}'
    awk '{print $1,$2}'

    图片 4

    能够看来awk自动把空格作为分段暗记,不管是不怎么个空格。

    4、指定#为呈现分隔符突显特定列(注意不会影响原来文本,只是影响展现)

    awk -F ':' '{print $1"#"$3"#"$7}' test.txt

    图片 5

    1. 打字与印刷文件的某列:

    awk '{print $2}' handdata
    注:handdata为文件名,当中的$1..$n代表第几例。注:$0代表一切行

      $1 第一列  $NF最后一列

    2、工作流程
    读取file、标准输入、管道给的数额,从第一行开始读取,逐行读取,看是或不是协作大家想要的多少(pattern形式相配),对数码进行拍卖,直到读完全部的行,退出awk程序(实践的每一条awk的下令)

    grep三大shell文本处理工具之awk的应用,awk常用基础命令。三、awk相称功能比如

    awk 寻觅操作时与sed命令同样,awk暗中同意扶助正则,无需像grep -E , sed -r 一样需求特地选项。
    1、找寻含首要字root的行

    awk '/root/' test.txt

    图片 6

    2、找寻第一竖列中蕴藏oo字符的行。

    sed -F ':' '$1 ~/oo/' test.txt

    图片 7

    留意那个波浪号~便是极度的意趣。

    3、寻找root和test任意匹配在那之中二个所在的行的首先列和第三列

    awk -F ':' '/root/{$1,$3} /test/{$1,$3}' test.txt
    awk -F ':' '/root|test/ {print $0}' test.txt

    图片 8

    图片 9

    4、寻找分割后第三段==0的行,也正是uid是零的行。

    awk -F ':' '$3==0' test.txt

    图片 10

    这一列也能够开展到别的数学表明式

    awk -F ':' '$3>=1000' test.txt

    图片 11

    awk -F ':' '$3<=100' test.txt

    图片 12

    5、找寻分割后最终不是/sbin/nologin的行

    awk -F ':' '$7!="/sbin/nologin" {print $1}' test.txt

    图片 13

    写正则时四个注意点:一是或不是怎么着的表明式为!=,二是字符串相称时要用双引号

    6、寻觅第三列大于第四列恐怕第七列==/sbin/nologin的行

    awk -F ':' '$3>$4||$7=="sbin/nologin"' test.txt

    图片 14

    ||表示依然,&&代表还要。

    7、寻找第三列大于第四列和第七列==/sbin/nologin的行

    awk -F ':' '$3>$4||$7&&"sbin/nologin"' test.txt

    图片 15

    2. 过滤记录:

    awk '$2==0 ' handdata
    注:筛选出第二列为零的
    awk '$2==0 && $3>10' handdata
    注:筛选出第二列等于0,第三列>10的
    筛选等于字符串的口径亟待用双引号
    awk '$2==”xxx”' handdata
    awk '$2==0 && $3>10 {print $0}' handdata
    注:筛选出第二列等于0,第三列>10的后,打字与印刷全体
    假诺大家须求表头的话,大家得以引进内建变量N福特Explorer
    Eg:awk '$2==0 && $3>10 || NR==1' handdata

          awk  '{print $1}’文件<==$1率先列,$2次之列…$NF最终一列,$(NF-1)

    3、语法
    awk [-F field seperator] 'pattern{action}' [file]

    四、awk内置变量功效举例

    awk命令自带了有个别变量:
    OFS:系统一分配隔符
    N雷克萨斯RC:总行数变量
    NF:分割后最大段数数值

    1、列出第三列大于1000数字恐怕第七段包蕴/bash/的行,打字与印刷这几个行的1、3、7段,并且用#做呈现分隔符。

    awk -F ':' '{OFS="#"} $3>1000|| $7 ~ /bash/ {print $1,$3,$7}' test.txt
    awk -F ':' '{OFS="#"} {if ($3>1000|| $7 ~ /bash/){print $1,$3,$7}}' test.txt

    图片 16

    图片 17
    2、展现分段的结尾一行

    awk -F ':' '{print $NF}' test |head -n3

    图片 18
    $NF 表示最后 NF表示段数,是一个数字

    3、显示文件,并在每一行前拉长行号==grep -n

    awk -F ':' {print NR":"$0} test.txt
    grep -n '' test.txt

    图片 19
    图片 20

    4、呈现前10行,同时复习sed写法。

    awk -F':' 'NR<=10 {print $0}' test.txt
    sed -n '1,10'p test.txt

    图片 21

    图片 22
    与此同时复习sed写法

    5、利用awk命令给$1f赋值

    head -n3 test.txt| awk -F ':' '{OFS=":"} $1="root"' test.txt

    图片 23

    注意与head -n3 test.txt| awk -F ':' '{OFS=":"} $1=="root"' test.txt的区别
    图片 24

    3. awk点名分隔符

    FS : 输入字段分隔符,默认空白(空格大概tab)。
    途乐S : 输入行分隔符,默许n。
    OFS : 输出字段分隔符,默许空格。
    O景逸SUVS : 输骑行分隔符,暗中同意n
    cat tcomvv160907 |awk -F"t" '{print $16}'|more
    打印 tcomvv160907文件按t分割的第十六列
    cat tcomvv160907 |awk -F"t" '$16==0 {print $0}'
    钦定输入输出分隔符
    head -n 5000 part-m-00000 |awk 'BEGIN{FS="01";OFS="t"} $30 == "电子商务" {print $1,$30}'
    代码中输入分隔符为01,输出分隔符为t
    总结某一列不重复的数量
    awk -F"01" '{cnt[$19]=1}END{print length(cnt)}' part-m-00000

    例:awk  {if(NR<31 && NR>19)  printf$1"n"}’test. txt

    -F: 内定元数据列(字段)分隔符
    ‘pattern’: 相称情势
    功用:相称出来要拍卖的数量。
    1)正则表明式
    [root@localhost html]# awk '/^J/{print}' awk_scores.txt

    五、awk数学生运动算例如

    1、计算第三段的值的和

    awk -F ':' '{(tot=tot $3)}; END {print tot}' test.txt

    图片 25

    4.对列求和:

    cat session160905new|awk '{sum =$2} END {print "Sum = ", sum}'

        NOdyssey代表行号,&& (and)並且  n回车换行   $0表示整行

    2)关系表明式 > < >= <= == != ~ !~
    [root@localhost html]# awk '$2>90{print}' awk_scores.txt

    5.或操作

    证实第多少个字的值是不是在1-20限量内,能够打印出不符合供给的多寡来声明,使用了暗中认可管理{print $0}(不钦定Action则选拔暗许的Action):
    grep三大shell文本处理工具之awk的应用,awk常用基础命令。awk -F',' '$3<1 || $3>20' data.csv

    awk多分隔符使用  awk -F "[, ]" '{print $3" "$6}' ianTest.txt 

    3) BEGIN格局在awk程序施行后,但从未施行管理动作前要做的做事(定义变量)
    [root@localhost html]# awk 'BEGIN{x="abc";print x}'

    6.甩卖八个大日志文件,只想随机抽出个中一些样本来举行分析

    awk 'rand()<0.1' log.csv > sample.csv
    在情势中,使用了rand()函数来随意发生0,1期间的小数,唯有当前发生的值小于0.1才打字与印刷当前行,即只随机收取百分之十的数额作为样本。

    4)END情势 awk程序推行完管理动作后要做的干活。(善后)
    [root@localhost html]# awk 'BEGIN{print "Scores report"} {print} END{print "Over!"}' awk_scores.txt

    7.倒数

    打字与印刷日志的字段数使用变量NF,最终一列数据选择变量$NF,倒数第二列使用$(NF-1):
    $ awk '{print NF, $NF,$(NF-1)}' log.csv

    {action}:处理动作,针对符合相配格局的数额进行的拍卖动作
    倘使未有pattern,独有action,会对持有的文本行推行action的拍卖动作
    如果未有action,唯有pattern,会打字与印刷出适合相称情势的行

    管理公事情势:
    [file]: awk要拍卖的文本行(源数据),能够是其它命令的出口、管道过来的数码

    4、指定awk的方式
    1)命令行格局:
    2)awk脚本:
    #!/usr/bin/awk -f
    BEGIN{
    print "Scores Report"
    }

    { print } //施行命令

    END{
    print "Over!"
    }

    [root@localhost html]# chmod u x awk.awk
    [root@localhost html]# ./awk.awk awk_scores.txt

    3)文件
    BEGIN{
    print "Scores Report"
    }

    { print }

    END{
    print "Over!"
    }

    [root@localhost html]# awk -f awk.awk awk_scores.txt

    5、截取
    行 记录 Record
    列 字段 Field
    字符串 现身在行和列的交点上 分明哪一行的哪一列

    5.1 截取列
    awk 内置变量:$n n为数字 $1 $2 $3 表示第几列
    [root@localhost html]# awk '{print $1,$2}' awk_scores.txt

    awk 内置变量:$NF 最终一列
    [root@localhost html]# awk '{print $1,$NF}' awk_scores.txt
    [root@localhost html]# ifconfig eth0 | awk 'NR==2{print $2}'|awk -F: '{print $2}'

    5.2 截取行(行:NR)
    1)NHaval numbers of record FN福特Explorer当前读到的行 NEvoque==1 FNEnclave==1 都以指第一行
    2)正则表达式
    3)条件表达式

    放到变量:$0 awk程序当前拍卖的行
    [root@localhost html]# awk 'NR==2{print $0}' awk_scores.txt

    示例:
    [root@localhost html]# awk '/^N/{print}' awk_scores.txt
    Nancy 89 90 73 82
    [root@localhost html]# awk 'NR==2{print}' awk_scores.txt
    Nancy 89 90 73 82
    [root@localhost html]# awk 'FNR==2{print}' awk_scores.txt
    Nancy 89 90 73 82
    [root@localhost html]# awk '$3>=90{print}' awk_scores.txt
    John 85 92 79 87
    Nancy 89 90 73 82

    5.3 截取字符串 哪一行的第几列找到字符串(列:$n)

    以下例子是截取第二行第5列的数额
    [root@localhost html]# df -h |awk 'NR==2{print $5}'
    49%

    6、格式化输出
    print 输出截取的数目,若是出口多列,列之间用“,”隔离-->输出后,变为空格
    退换输出后的列值分割符号:

    [root@localhost html]# awk '{print $3":"$4":"$1}' awk_scores.txt //冒号必要引起来
    92:79:John
    90:73:Nancy
    88:92:Tom
    65:83:Kity
    89:80:Han
    76:85:Kon

    7、BEGIN 

    BEGIN 个中的代码在实行动作以前施行,程序运营后,个中的代码只进行三次。设置定义变量。
    变量名 对应单词 意义

    列:
    FS      田野 separator 字段分隔符(awk管理的源文本的字段分隔符,私下认可空格或tab)
    OFS   output 田野 separator 输出的分隔符(私下认可空格)

    行:
    RS      record separator 记录分隔符(暗中同意换行符n)
    ORS   output record separator 输出记录换行符

    awk 'BEGIN{FS=":"}{print $1}' /etc/passwd //在读取源文件时,让awk以为列的相间符为“:”
    awk 'BEGIN{FS=":"}{print $1,$2,$3}' /etc/passwd //输出四个列
    awk 'BEGIN{FS=":";OFS="-"}{print $1,$2,$3}' /etc/passwd //输出时,钦赐输出列的相间符为“-”
    awk -F: '{print $1"-"$2"-"$3}' /etc/passwd(等同)

    [root@localhost html]# cat awk_scores.txt
    John 85 92 79 87
    Nancy 89 90 73 82

    Tom 81 88 92 81
    Kity 79 65 83 90
    Han 92 89 80 83
    Kon 88 76 85 97

    打字与印刷第一行:
    [root@localhost html]# awk 'BEGIN{RS=""}NR==1{print}' awk_scores.txt //通过“PAJEROS=""”定义行的相间符为空行

    源文件:
    [root@localhost html]# cat awk_contacts.txt
    danny male 
    china beijing
    (8103)82456789

    jeck male
    Japan Tokyo
    (8103)82456789

    xi female
    America Washington
    (8103)82456789

    danny male china beijing (8103)82456789
    jeck male Japan Tokyo (8103)82456789
    xi female America Washington (8103)82456789

    渴求输出时,各样顾客占一行,仅输出客户名、性别、联系电话

    [root@localhost html]# awk 'BEGIN{RS="";FS="n"}{print $1,$3}' awk_contacts.txt
    danny male (8103)82456789
    jeck male (8103)82456789
    xi female (8103)82456789
    //分析:通过OdysseyS=""调整行的相间符为空行,再通过FS="n"调节字段的相间符为换行符(回车),然后打字与印刷第一列和第三列

    例:vim c.txt
    1
    2
    3
    4
    5

    总计出第一行和第三行的和
    [root@server ~]# awk 'BEGIN{RS="";FS="n"}{print $1 $3}' c.txt
    4

    //解析:通过途达S=""调控行的相间符为空行,通过奥迪Q5S之后上述例子只可以分出一行(全数数字产生一行了),再通过FS="n"调整字段的相间符为换行符(回车),然后打字与印刷第一列和第三列的和

    8、回头看awk的做事进度
    1)awk首选读取文件的率先行,将该行赋值给$0,暗许行的相间符是回车n
    2)通过空格(制表符)将行分割成多个字段(列),并将列值赋值给$n,$1 $2 $3
    3) awk怎么样直到列分隔符?运转程序之处,有叁个内置变量FS来表示字段分隔符,程序最早化FS被定义为空格、制表符
    4)print 打字与印刷(实行拍卖动作),OFS默感觉空格
    5)读取下一行

     

    9、高等游戏的方法
    数学生运动算
    比较运算
    逻辑运算
    变量
    数组
    流程序调整制 if for while (类C)

    9.1 数学生运动算

    •  -  *  /  %   ^  **   注意:^号和**号都以指数运算
      [root@localhost html]# awk 'BEGIN{print 1 1}'
      2
      [root@localhost html]# awk 'BEGIN{print 1-1}'
      0
      [root@localhost html]# awk 'BEGIN{print 10*2}'
      20
      [root@localhost html]# awk 'BEGIN{print 10/2}'
      5
      [root@localhost html]# awk 'BEGIN{print 10%2}'
      0
      [root@localhost html]# awk 'BEGIN{print 10**2}'
      100
      [root@localhost html]# awk 'BEGIN{print 10**3}'
      1000
      [root@localhost html]# awk 'BEGIN{print 10^3}'
      1000
      [root@localhost html]# awk 'BEGIN{print 2^10}'

     

    [root@localhost html]# awk '{print $1,$2 $3 $4 $5}' awk_scores.txt
    John 343
    Nancy 334
    Tom 342
    Kity 317
    Han 344
    Kon 346

    9.2 比较运算
    >  <  >=  <=  ==  !=  ~  !~
    awk '$2!=89{print}' awk_scores.txt
    awk '/$1~^T/{print}' awk_scores.txt
    awk '$1~/^T/{print}' awk_scores.txt
    awk '$1~/^Han/{print}' awk_scores.txt

    awk '$2!=92{print}' awk_scores.txt
    awk '$2!~92{print}' awk_scores.txt

    注意:~号表示十一分正则表明式,!~表示不相配。如上最后一例是意味 "截取第二列全部不为92的数量。"

    9.3 逻辑运算
    与 &&
    或 ||
    非 !

    [root@localhost html]# awk '$2>80 && $3>80 && $4>80 && $5>80{print}' awk_scores.txt

    9.4 变量
    awk 命超级模特式 shell key=value 不容许数字起初
    awk中变量若无没提前赋值,变量的发轫值-->变量的等级次序(字符串和数值)
    字符串 -->初始值“空”
    数值 -->初始值“0”

    比如定义变量即援引变量:
    [root@localhost html]# awk 'BEGIN{n=1;print n}'
    1

    [root@localhost html]# awk 'BEGIN{var="abc";print var}'
    abc

    总结内存使用率:
    [root@localhost html]# awk 'NR==1{t=$2}NR==2{f=$2;print (t-f)/t*100}' /proc/meminfo | awk -F. '{print $1}'

     

    9.5 数组
    shell中
    array=(1 2 3 4 5) 数组的下标从0 引用echo ${array[*]}

    awk中
    array[n]=value 数组的下标从1初步

    awk引用数组:
    array[n] n代表下标

    概念数组array,赋值,援引:

    [root@localhost html]# awk 'BEGIN{array[1]=10;array[2]=11;array[3]=12;print array[1],array[2],array[3]}'
    10 11 12
    [root@localhost html]# vim array.awk
    [root@localhost html]# awk -f array.awk
    A B C
    [root@localhost html]# cat array.awk
    BEGIN{
    array[1]="A"
    array[2]="B"
    array[3]="C"

    print array[1],array[2],array[3]
    }
    [root@localhost html]# awk -f array.awk
    A B C

    9.6 if语句
    if (expression)
    {
    statement
    }
    else
    {
    statement
    }

     

    示例:

    #!/bin/awk -f --->#!/usr/bin/awk -f
    {
    if ($2>=80)
    { print $1,"Pass"}
    else
    { print $1,"Nopass"}
    }
    

     

    之决断为确实际景况况

    #!/bin/awk -f
    {
    if ($2>=80)
    { print $1,"Pass"}
    }
    

     

    [root@localhost html]# awk '{
    > if($2>=80)
    > {print $1,"Pass"}
    > }' awk_scores.txt
    John Pass
    Nancy Pass
    Tom Pass
    Han Pass
    Kon Pass

     

    9.7 for

    for循环为数组赋值

    #!/bin/awk -f
    BEGIN{
    for(i=1;i<5;i  )
    {
    array[i]=i
    print array[i]
    }
    }
    

     

    增多运算

    #!/bin/awk -f
    {
    sum=0
    for(i=1;i<5;i  )
    {
    sum =$i
    }
    print sum
    }
    

     

     

    while

    格式:

    while(表达式)

    {语句}

    例:

    #!/bin/awk -f
    BEGIN{
    a=10;
    b=0;
    while (i<=10)
    {
    b=a b;
    i  ;
    }
    print b;
    }
    

     

    本文由新葡亰496net发布于电脑系统,转载请注明出处:grep三大shell文本处理工具之awk的应用,awk常用基

    关键词: