• Linuxawk工具的使用

    2018-10-12 22:01:31
    目录 awk awk的用法 ...简单来说awk就是把文件逐行的读入,默认以空格为分隔符将每行切片,切开的部分再进行各种分析处理。 awk是行处理器,相比较屏幕处理的优点,在处理庞大文件时不会出现内...

    目录

    awk

    awk的用法

    awk中字符的含义

    print 打印

    字符匹配

    格式化输出

    举例


    awk

    awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,默认以空格为分隔符将每行切片,切开的部分再进行各种分析处理。 awk是行处理器,相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息

    awk处理过程: 依次对每一行进行处理,然后输出

    awk的用法:

    awk   参数       ' BEGIN{}  //  {action1;action2} '   END{}      文件名

    参数: 

    • -F   指定分隔符
    • -f    调用脚本
    • -v   定义变量

    Begin{}    初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符

    //            匹配代码块,可以是字符串或正则表达式

    {}            命令代码块,包含一条或多条命令,多条命令用 ;  隔开

    END{}      结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息

    例: awk  'BEGIN{X=0}/root/{X+=1}END{print "I find",X,"root lines"}'   /etc/passwd      统计 /etc/passwd 文件中包含root行的总数

    awk中字符的含义:

    • $0           表示整个当前行
    • $1           每行第一个字段
    • NF          字段数量变量
    • NR          每行的记录号,多文件记录递增
    • FNR        与NR类似,不过多文件记录不递增,每个文件都从1开始
    • \t            制表符
    • \n           换行符
    • FS          BEGIN时定义分隔符
    • RS         输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)
    • ~            包含
    • !~           不包含
    • ==         等于,必须全部相等,精确比较
    • !=           不等于,精确比较
    • &&         逻辑与
    • ||             逻辑或
    • +            匹配时表示1个或1个以上
    • /[0-9][0-9]+/     两个或两个以上数字
    • /[0-9][0-9]*/     一个或一个以上数字
    • OFS         输出字段分隔符, 默认也是空格,可以改为其他的
    • ORS        输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕
    • -F  [:#/]    定义了三个分隔符

    print 打印

    • print 是 awk打印指定内容的主要命令,也可以用 printf
    • awk '{print}'  /etc/passwd   ==   awk '{print $0}'  /etc/passwd  
    • awk '{print " "}'  /etc/passwd          不输出passwd的内容,而是输出相同个数的空行,进一步解释了awk是一行一行处理文本
    • awk '{print "a"}'   /etc/passwd                                        输出相同个数的a行,一行只有一个a字母
    • awk -F:  '{print $1}'  /etc/passwd  ==   awk  -F  ":"  '{print $1}'  /etc/passwd
    • awk -F: '{print $1 $2}'                                                 输入字段1,2,中间不分隔
    • awk -F: '{print $1,$3,$6}' OFS="\t" /etc/passwd          输出字段1,3,6, 以制表符作为分隔符
    • awk -F: '{print $1; print $2}'   /etc/passwd                   输入字段1,2,分行输出
    • awk -F: '{print $1 "**" print $2}'   /etc/passwd                输入字段1,2,中间以**分隔
    • awk -F: '{print "name:"$1"\tid:"$3}' /etc/passwd            自定义格式输出字段1,2
    • awk -F: '{print NF}' /etc/passwd                                     显示每行有多少字段
    • awk -F: 'NF>2{print }' /etc/passwd                                 将每行字段数大于2的打印出来
    • awk -F: 'NR==5{print}' /etc/passwd                               打印出/etc/passwd文件中的第5行
    • awk -F: 'NR==5|NR==6{print}' /etc/passwd                   打印出/etc/passwd文件中的第5行和第6行
    • awk -F: 'NR!=1{print}'  /etc/passwd                               不显示第一行
    • awk -F: '{print > "1.txt"}'  /etc/passwd                            输出到文件中
    • awk -F: '{print}' /etc/passwd > 2.txt                                使用重定向输出到文件中                                     

    字符匹配

    • awk  -F: '/root/{print }'  /etc/passwd                         打印出文件中含有root的行
    • awk  -F: '/'$A'/{print }'  /etc/passwd                         打印出文件中含有变量 $A的行
    • awk -F: '!/root/{print}' /etc/passwd                           打印出文件中不含有root的行
    • awk -F:  '/root|tom/{print}'  /etc/passwd                    打印出文件中含有root或者tom的行
    • awk -F: '/mail/,mysql/{print}'  test                            打印出文件中含有 mail*mysql 的行,*代表有0个或任意多个字符
    • awk -F: '/^[2][7][7]*/{print}'  test                              打印出文件中以27开头的行,如27,277,27gff 等等
    •  
    • awk -F: '$1~/root/{print}' /etc/passwd                     打印出文件中第一个字段是root的行
    • awk -F: '($1=="root"){print}' /etc/passwd               打印出文件中第一个字段是root的行,与上面的等效
    • awk -F: '$1!~/root/{print}' /etc/passwd                   打印出文件中第一个字段不是root的行
    • awk -F: '($1!="root"){print}' /etc/passwd                打印出文件中第一个字段不是root的行,与上面的等效
    • awk -F: '$1~/root|ftp/{print}' /etc/passwd               打印出文件中第一个字段是root或ftp的行
    • awk -F: '($1=="root"||$1=="ftp"){print}' /etc/passwd   打印出文件中第一个字段是root或ftp的行,与上面的等效
    • awk -F: '$1!~/root|ftp/{print}' /etc/passwd              打印出文件中第一个字段不是root或不是ftp的行
    • awk -F: '($1!="root"||$1!="ftp"){print}' /etc/passwd    打印出文件中第一个字段不是root或不是ftp的行,与上面等效
    • awk -F: '{if($1~/mail/) {print $1} else {print $2}}'  /etc/passwd   如果第一个字段是mail,则打印第一个字段,否则打印第2个字段

    格式化输出

    awk  '{printf  "%-5s %.2d",$1,$2}'  test

    • printf 表示格式输出
    • %格式化输出分隔符
    • -8表示长度为8个字符
    • s表示字符串类型,d表示小数

    举例:

    1、显示 /etc/passwd 中含有 root 的行
    awk '/root/'  /etc/passwd
    2、以 : 为分隔,显示/etc/passwd中每行的第1和第7个字段
    awk -F ":" '{print $1,$7}' /etc/passwd  或  awk 'BEGIN{FS=":"}{print $1,$7}' /etc/passwd
    3、以 : 为分隔,显示/etc/passwd中含有 root 的行的第1和第7个字段
    awk -F ":" '/root/{print $1,$7}' /etc/passwd
    4、以 : 为分隔,显示/etc/passwd中以 root 开头行的第1和第7个字段
    awk -F ":" '/^root/{print $1,$7}' /etc/passwd
    5、以 : 为分隔,显示/etc/passwd中第3个字段大于999的行的第1和第7个字段
    awk -F ":" '$3>999{print $1,$7}'  /etc/passwd
    6、以 : 为分隔,显示/etc/passwd中第7个字段包含bash的行的第1和第7个字段
    awk -F ":" '$7~"bash"{print $1,$7}' /etc/passwd
    7、以 : 为分隔,显示/etc/passwd中第7个字段不包含bash的行的第1和第7个字段
    awk -F ":" '$7!~"nologin"{print $1,$7}'  /etc/passwd
    8、以 : 为分隔,显示$3>999并且第7个字段包含bash的行的第1和第7个字段
    awk -F ":" '$3>999&&$7~"bash"{print $1,$7}' /etc/passwd
    9、以 : 为分隔,显示$3>999或第7个字段包含bash的行的第1和第7个字段
    awk -F ":" '$3>999||$7~"bash"{print $1,$7}' /etc/passwd

     

     

    展开全文
  • 文件: [root@system1 ~]# cat test test word test word test word test word test word word test word hello test word nihao test word nihao test word hi test word test word test word test wor
    原文件:
    [root@system1 ~]# cat test
    test word
    test word
    test word
    test word
    test word word
    test word hello
    test word nihao
    test word nihao
    test word hi
    test word
    test word
    test word
    test word
    test word
    test word
    test word
    awk修改写入原文件后的文件:
    [root@system1 ~]# cat test
    test word
    test word
    test word
    test word
    test word word
    test word hello
    test word ni
    test word ni
    test word hi
    test word
    test word
    test word
    test word
    test word
    test word
    test word
    
    
    #注意:重定向符号后面的文件名需要加双引号
    awk '{print > "file"}' file
    
    awk  '$3!~/test/{sub("nihao","ni");print >"test"}' test
    
    sed写入原文件加 -i参数 
    
    sed -i 's/nihao/ni/g' test 
    
    
    
    
    
    展开全文
  • 简单使用: awk :对于文件中一行行的独处来执行操作 。...awk语言的最基本功能是在文件或字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作,完整的awk脚本通常用来格式化文本文件中的信息

    简单使用:

    awk :对于文件中一行行的独处来执行操作 。

    awk -F :'{print $1,$4}'   :使用‘:’来分割这一行,把这一行的第一第四个域打印出来 。

     

     

    详细介绍:

    AWK命令介绍

     

    awk语言的最基本功能是在文件或字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作,完整的awk脚本通常用来格式化文本文件中的信息

     

    1.   调用awk:

     

    第一种命令行方式,:

     

    awk [-Field-separator] 'commands' input-file(s)

     

    这里commands是真正的awk命令,[-F域分隔符]是可选的,awk默认使用空格分隔,因此如果要浏览域间有空格的文本,不必指定这个选项,但如果浏览如passwd文件,此文件各域使用冒号作为分隔符,则必须使用-F选项:   awk -F : 'commands' input-file

     

       第二种,将所有awk命令插入一个文件,并使awk程序可执行,然后用awk命令解释器作为脚本的首行,以便通过键入脚本名称来调用它

     

       第三种,将所有awk命令插入一个单独文件,然后调用,如: 

     

    awk -f awk-script-file input-file

     

    -f选项指明在文件awk-script-file的awk脚本,input-file是使用awk进行浏览的文件名

     

    2.   awk脚本:

     

        awk脚本由各种操作和模式组成,根据分隔符(-F选项),默认为空格,读取的内容依次放置到对应的域中,一行一行记录读取,直到文件尾

     

    2.1.      模式和动作   

     

    任何awk语句都是由模式和动作组成,在一个awk脚本中可能有许多语句。模式部分决定动作语句何时触发及触发事件。动作即对数据进行的操作,如果省去模式部分,动作将时刻保持执行状态

     

        模式可以是任何条件语句或复合语句或正则表达式,模式包含两个特殊字段BEGIN和END,使用BEGIN语句设置计数和打印头,BEGIN语句使用在任何文本浏览动作之前,之后文本浏览动作依据输入文件开始执行;END语句用来在awk完成文本浏览动作后打印输出文本总数和结尾状态标志,有动作必须使用{}括起来

     

        实际动作在大括号{}内指明,常用来做打印动作,但是还有更长的代码如if和循环looping语句及循环退出等,如果不指明采取什么动作,awk默认打印出所有浏览出的记录

     

    2.2.     域和记录:

     

    awk执行时,其浏览标记为$1,$2...$n,这种方法称为域标记。使用$1,$3表示参照第1和第3域,注意这里使用逗号分隔域,使用$0表示使用所有域。例如:

     

    awk '{print $0}' temp.txt > sav.txt  

     

    表示打印所有域并把结果重定向到sav.txt中

     

    awk '{print $0}' temp.txt|tee sav.txt 

     

     和上例相似,不同的是将在屏幕上显示出来

     

    awk '{print $1,$4}' temp.txt

     

       只打印出第1和第4域

     

    awk 'BEGIN {print "NAME  GRADE\n----"} {print $1"\t"$4}' temp.txt 

     

    表示打信息头,即输入的内容的第一行前加上"NAME  GRADE\n-------------",同时内容以tab分开

     

    awk 'BEGIN {print "being"} {print $1} END {print "end"}' temp 

     

    同时打印信息头和信息尾

     

    2.3.     条件操作符:

     

        <、<=、==、!=、>=、~匹配正则表达式、!~不匹配正则表达式

     

        匹配:awk '{if ($4~/ASIMA/) print $0}' temp 表示如果第四个域包含ASIMA,就打印整条

     

        精确匹配:awk '$3=="48" {print $0}' temp    只打印第3域等于"48"的记录

     

        不匹配:  awk '$0 !~ /ASIMA/' temp      打印整条不包含ASIMA的记录

     

        不等于:  awk '$1 != "asima"' temp

     

        小于:    awk '{if ($1<$2) print $1 "is smaller"}' temp

     

        设置大小写: awk '/[Gg]reen/' temp      打印整条包含Green,或者green的记录

     

        任意字符: awk '$1 ~/^...a/' temp    打印第1域中第四个字符是a的记录,符号’^’代表行首,符合’.’代表任意字符

     

        或关系匹配: awk '$0~/(abc)|(efg)/' temp   使用|时,语句需要括起来

     

        AND与关系:  awk '{if ( $1=="a" && $2=="b" ) print $0}' temp

     

        OR或关系:   awk '{if ($1=="a" || $1=="b") print $0}' temp

     

    2.4.     awk内置变量:

     

    ARGC  

    命令行参数个数

    NF    

     浏览记录的域个数

    AGRV  

    命令行参数排列

    NR  

    已读的记录数   

    ENVIRON  

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

    OFS  

    输出域分隔符

    FILENAME  

    awk浏览的文件名  

    ORS 

    输出记录分隔符

    FNR  

    浏览文件的记录数  

    RS  

    控制记录分隔符

    FS  

    设置输入域分隔符,同- F选项

    NF    

     浏览记录的域个数

     

    例: awk 'END {print NR}' temp    在最后打印已读记录条数

     

        awk '{print NF,NR,$0} END {print FILENAME}' temp

     

        awk '{if (NR>0 && $4~/Brown/) print $0}' temp  至少存在一条记录且包含Brown

     

        NF的另一用法:  echo $PWD | awk -F/ '{print $NF}'   显示当前目录名

     

    2.5.     awk操作符:

     

    在awk中使用操作符,基本表达式可以划分成数字型、字符串型、变量型、域及数组元素

     

    设置输入域到变量名:

     

        awk '{name=$1;six=$3; if (six=="man") print name " is " six}' temp

     

        域值比较操作:

     

    awk 'BEGIN {BASE="27"} {if ($4<BASE) print $0}' temp

     

        修改数值域取值:(原输入文件不会被改变)

     

    awk '{if ($1=="asima") $6=$6-1;print $1,$6,$7}' temp

     

        修改文本域:

     

    awk '{if ($1=="asima) ($1=="desc");print $1}' temp

     

        只显示修改记录:(只显示所需要的,区别上一条命令,注意{})

     

    awk '{if ($1=="asima) {$1=="desc";print$1}}' temp

     

        创建新的输出域:

     

    awk '{$4=$3-$2; print $4}' temp

     

        统计列值:

     

    awk '(tot+=$3);END {print tot}' temp           会显示每列的内容

     

    awk '{(tot+=$3)};END {print tot}' temp         只显示最后的结果

     

        文件长度相加:

     

    ls -l|awk '/^[^d]/ {print $9"\t"$5} {tot+=$5} END{print "totKB:" tot}'

     

        只列出文件名:

     

    ls -l|awk '{print $9}'     常规情况文件名是第9域

     

    2.6.     awk内置字符串函数:

     

    gsub(r,s)           在整个$0中用s替代r

     

    awk 'gsub(/name/,"xingming") {print $0}' temp

     

    gsub(r,s,t)         在整个t中用s替代r

     

    index(s,t)          返回s中字符串t的第一位置

     

    awk 'BEGIN {print index("Sunny","ny")}' temp     返回4

     

    length(s)           返回s的长度

     

    match(s,r)          测试s是否包含匹配r的字符串

     

    awk '$1=="J.Lulu" {print match($1,"u")}' temp    返回4

     

    split(s,a,fs)       在fs上将s分成序列a

     

    awk 'BEGIN {print split("12#345#6789",myarray,"#")"'

     

    返回3,同时myarray[1]="12", myarray[2]="345", myarray[3]="6789"

     

    sprint(fmt,exp)     返回经fmt格式化后的exp

     

    sub(r,s)   从$0中最左边最长的子串中用s代替r(只更换第一遇到的匹配字符串)

     

    substr(s,p)         返回字符串s中从p开始的后缀部分

     

    substr(s,p,n)       返回字符串s中从p开始长度为n的后缀部分

     

    2.7.     printf函数的使用:

     

    字符转换: echo "65" |awk '{printf "%c\n",$0}'    输出A

     

                awk 'BEGIN {printf "%f\n",999}'        输出999.000000

     

    格式化输出:awk '{printf "%-15s %s\n",$1,$3}' temp 将第一个域全部左对齐显示

     

    2.8.     其他awk用法:

     

        向一行awk命令传值:

     

    awk '{if ($5<AGE) print $0}' AGE=10 temp

     

    who | awk '{if ($1==user) print $1 " are in " $2 ' user=$LOGNAME 使用环境变量

     

    awk脚本命令:

     

    开头使用 !/bin/awk -f  ,如果没有这句话自含脚本将不能执行,例子:

     

    !/bin/awk -f

     

    # all comment lines must start with a hash '#'

     

    # name: student_tot.awk

     

    # to call: student_tot.awk grade.txt

     

    # prints total and average of club student points

     

    # print a header first

     

    BEGIN

     

    {

     

    print "Student    Date   Member No.  Grade  Age  Points  Max"

     

    print "Name  Joined Gained  Point Available"

     

    print"========================================================="

     

    }

     

    # let's add the scores of points gained

     

    (tot+=$6);

     

    # finished processing now let's print the total and average point

     

    END

     

    {

     

        print "Club student total points :" tot

     

        print "Average Club Student points :" tot/N

     

    }

     

    2.9.     awk数组:

     

    awk的循环基本结构

     

    For (element in array) print array[element]

     

    awk 'BEGIN {record="123#456#789";split(record,myarray,"#")} 

     

    END { for (i in myarray) {print myarray[i]} }

     

     

    3.0  awk中自定义语句

     

    一.条件判断语句(if)

    if(表达式) #if ( Variable in Array )
    语句1
    else
    语句2

    格式中"语句1"可以是多个语句,如果你为了方便Unix awk判断也方便你自已阅读,你最好将多个语句用{}括起来。Unix awk分枝结构允许嵌套,其格式为:

    if(表达式)

    {语句1}

    else if(表达式)
    {语句2}
    else
    {语句3}

    [xifj@localhost nginx]# awk 'BEGIN{
    test=100;
    if(test>90)
    {
        print "very good";
    }
    else if(test>60)
    {
        print "good";
    }
    else
    {
        print "no pass";
    }
    }'

    very good

     

    每条命令语句后面可以用“;”号结尾。

     

    二.循环语句(while,for,do)

    1.while语句

    格式:

    while(表达式)

    {语句}

    例子:

    [xifj@localhost nginx]# awk 'BEGIN{
    test=100;
    total=0;
    while(i<=test)
    {
        total+=i;
        i++;
    }
    print total;
    }'
    5050

    2.for 循环

    for循环有两种格式:

    格式1:

    for(变量 in 数组)

    {语句}

    例子:

    [xifj@localhost nginx]# awk 'BEGIN{
    for(k in ENVIRON)
    {
        print k"="ENVIRON[k];
    }
    }'

    AWKPATH=.:/usr/share/awk
    OLDPWD=/home/web97
    SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
    SELINUX_LEVEL_REQUESTED=
    SELINUX_ROLE_REQUESTED=
    LANG=zh_CN.GB2312

    。。。。。。

    说明:ENVIRON 是awk常量,是子典型数组。

    格式2:

    for(变量;条件;表达式)

    {语句}

    例子:

    [xifj@localhost nginx]# awk 'BEGIN{
    total=0;
    for(i=0;i<=100;i++)
    {
        total+=i;
    }
    print total;
    }'

    5050

    3.do循环

    格式:

    do

    {语句}while(条件)

    例子:

    [xifj@localhost nginx]# awk 'BEGIN{
    total=0;
    i=0;
    do
    {
        total+=i;
        i++;
    }while(i<=100)
    print total;
    }'
    5050

     

    以上为awk流程控制语句,从语法上面大家可以看到,与c语言是一样的。有了这些语句,其实很多shell程序都可以交给awk,而且性能是非常快的。

    break 当 break 语句用于 while 或 for 语句时,导致退出程序循环。
    continue 当 continue 语句用于 while 或 for 语句时,使程序循环移动到下一个迭代。
    next 能能够导致读入下一个输入行,并返回到脚本的顶部。这可以避免对当前输入行执行其他的操作过程。
    exit 语句使主输入循环退出并将控制转移到END,如果END存在的话。如果没有定义END规则,或在END中应用exit语句,则终止脚本的执行。
    展开全文
  • linuxawk的使用

    2018-02-23 16:49:52
    AWK是一种优良的文本处理工具。其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母,AWK 提供了极其强大的功能:可以进行样式装入、流控制、数学运算符、进程控制语句甚至于...
    AWK是一种优良的文本处理工具。其名称得自于它的创始人 Alfred Aho Peter Weinberger  Brian Kernighan 姓氏的首个字母,AWK 提供了极其强大的功能:可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。它具备了一个完整的语言所应具有的几乎所有精美特性。实际上 AWK 的确拥有自己的语言:AWK 程序设计语言, 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。
    相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
    
    printf '%s\n' `cat abc.txt`
    printf '%s\n' $(cat abc.txt)
    
    printf '输出类型输出格式' 输出内容
    
    输出类型:
    %s		输出字符串
    %i		输出整数
    %f		输出浮点数
    
    输出格式:
    \n		换行
    \t		制表符
    
    例子:
    printf "%-5s %-10s %-4s\n" NO Name Mark
    printf "%-5s %-10s %-4.2f\n" 01 Tom 90.3456
    printf "%-5s %-10s %-4.2f\n" 02 Jack 89.2345
    printf "%-5s %-10s %-4.2f\n" 03 Jeff 98.4323
    
    说明:
    %-5s 格式为左对齐且宽度为5的字符串代替(-表示左对齐),不使用则是又对齐。 
    %-4.2f 格式为左对齐宽度为4,保留两位小数。
    
    printf '%s %s %s\n' a b c d e f
    printf '%5s %s %s\n' a b c d e f
    printf '%-5s %s %s\n' a b c d e f
    
    -------------------------------------------------------------------------------------------------------------
    cut不够强大
    
    df -h | cut -d ' ' -f 2
    df -h | awk '{print $2}'
    
    awk命令格式
    awk 'pattern1 {action1} pattern2 {action2} ...' filename
    
    awk默认的分隔符是空格或制表符
    
    cat /etc/passwd | awk -F ':' '{print $0}'
    awk -F ':' '{print $2}' /etc/passwd
    
    awk -F ':' '1>5 {print $1} 2>1 {print $2}' /etc/passwd
    
    awk 'BEGIN {print "this file is /etc/passwd"} {print $0}'
    
    awk -F ':' 'BEGIN {print "this file is /etc/passwd"} {print $1}' /etc/passwd
    
    awk '{FS=":"} {print $1}' /etc/passwd
    awk 'BEGIN {FS=":"} {print $1}' /etc/passwd
    
    awk 'END {print "end of file"} {print $1}' /etc/passwd
    

    展开全文
  • 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调用的具体案例1.现在有文件file3.txt,内容如下:2.ak2.awk脚本#打印标题并格式化打印出数量...
  • LINUX学习—awkLINUX三剑客) awk是一个报告生成器,拥有强大的文本格式化能力; 也是一种文本处理工具,但其主要功能是从处理文件中按照输入的信息格式后显示的工具 awk是一种编程语言,支持条件判断、数组、...
  • linux awk命令详解

    2019-04-25 11:09:45
    awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息 awk处理过程:依次对每一行进行处理,然后输出 awk命令形式: awk [-F|-f|-v] ‘BEGIN{} //{...
  • 解:cat:打开文件命令 文件名:打开的文件名字 |:管道 awkawk文件分析命令 ‘{}’:文件操作 print:在新文件中输出 “*”:在新文件中输出的内容,*可以是任何内容 $2:在新文件中输出,旧文件的...
  • 关于awk的多文件处理: awk的数据输入有两个来源,标准输入和文件,后一种方式支持多个文件,如 1、shell的Pathname Expansion方式:awk '{...}' *.txt # *.txt先被shell解释,替换成当前目录下的所有*.txt,如当前...
  • #注意:重定向符号后面的文件名需要加双引号 awk '{print &gt; "file"}' file  
  • Grep是linux中自带的文件内容筛选工具,grep使用格式:grep [options] 1.查询:grep [keyword] filename 在filename中查询包含keyword的行 2.显示行号:-n 3.统计次数:-c 4.忽略大小:-i 5.逆向查找,输出不...
  • 这两天刚刚接触了linux 的shell, 记录一下供自己以后参考 awk命令: awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自定义...
  • Linuxawk命令简介

    2019-06-17 18:52:11
    初识awk 我们先来用专业的术语描述一下awk是什么,如果你看不懂,没关系,我们会再用"大白话"解释一遍。 awk是一个报告生成器,它拥有强大的文本格式化的能力,这就是专业的说法。 你可能不理解所谓的报告生成器...
  • Windows 文件格式和linux最大的区别就是有"\r",因此可以通过grep判断文件是否含有"\r"来判断该文件是否为Windows格式。 grep -r $'\r' * > log.txt 判断当前文件夹下的所有文件是否有"\r" 然后通过awk工具...
  • 修改兑换码对应的奖励 awk -F',' '{ if(substr($1,0,3) == "AJ4"){$4="100 1019 1|1 2 20000|101 99 20"; print >> "/home/test/redeem_data_rlt/"FILENAME} }' 4[0,1,2,3]/t_whole_redeem_*.csv
  • linux 之shell篇 awk命令

    2018-06-05 09:55:01
    一、awk编程模型 awk为程序员提供了完整的编程模型,awk程序由一...例如在java中,程序员需要一个main函数,打开文件、读取文件行、进行相应处理,关闭文件awk自动完成了上述步骤。 awk还定义了两个特殊的字段...
  • linux awk命令介绍

    2018-06-02 13:38:24
    所以,很多时候我们还会使用到awk命令,awk命令是一个功能十分强大的命令,学会awk命令对我们解决问题有很大帮助。说到这里可能有人会想到sed命令,sed命令常常作用于一整行的处理,awk则比较倾向...
  • 提一个简单的需求,求两个文件的join集合。具体举个例子:file1:1 sh wahaha 2 bj lebaishi 3 nj jack 4 sz rose 5 bj hahahafile2:bj 010 sh 021过滤出file1的第二列的值与file2的第一列的值对应的相等的记录,用...
1 2 3 4 5 ... 20
收藏数 84,733
精华内容 33,893