精华内容
下载资源
问答
  • linux awk命令详解

    2019-09-11 21:17:21
  • Linux awk命令详解

    2017-08-05 10:09:03
    Linux awk命令详解

    本文转自:http://blog.csdn.net/SeeTheWorld518/article/details/48630271

    awk :适用程序,一种unix工具 
    就是一个强大的文本分析工具,相对于grep查找、sed的编辑,awk在对数据分析并生成报告的时候,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种处理。

    • awk是用来操作数据和产生报表的一种编程语言。数据可能来自标准输入、一个或多个文件或一个进程的输出等。awk可以用在命令行里进行简单操作,也可应用到较大的应用程序中。
    • awk是一门编程语法,作为unix工具来使用简化了很多,但是仍然有许多编程语言的特性,可以对目标进行一系列的处理。
    • 如果抛出awk的BEGIN和END,对文件的每行,awk都分两个阶段处理: 
      1、读取该行内容,分配临时寄存器,分配域名等操作; 
      2、对域做各种处理并输出;

    • awk基本用途 
      1、简单输出,如 awk ‘{print 1,NF}’ — print的规则 
      2、作为分隔符使用 
      单字符分隔符:打印系统中用户名和其他使用shell类型 
      单字符分隔符,管道连续使用awk:打印nginx日志中的访问目录。 
      多字符分隔符:抓取apache详细版本 
      多字符多个分隔符:截取ip地址 
      正则分隔符:截取ip地址

    [root@admin test]# ls -l
    total 16
    -rw-r--r--. 1 root root    0 Jun 15 11:03 aa.jpg
    -rw-r--r--. 1 root root   12 Jun 15 10:48 ls.jpg
    -rw-r--r--. 1 root root  200 Jun 15 11:31 result.jpg
    -rw-r--r--. 1 root root    0 Jun 15 11:04 right.jpg
    drwxr-xr-x. 2 root root 4096 Jun 20 06:39 sd.ex
    -rw-r--r--. 1 root root   49 Jun 15 11:04 wrong.jpg
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    通过awk打印出第一列:

    [root@admin test]# ls -l | awk '{print $1}'
    total
    -rw-r--r--.
    -rw-r--r--.
    -rw-r--r--.
    -rw-r--r--.
    drwxr-xr-x.
    -rw-r--r--.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    打印前两列,也就是前两个域:

    [root@admin test]# ls -l | awk '{print $1,$2}'
    total 16
    -rw-r--r--. 1
    -rw-r--r--. 1
    -rw-r--r--. 1
    -rw-r--r--. 1
    drwxr-xr-x. 2
    -rw-r--r--. 1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在awk中,抛开BEGIN和END不看,’{}’ 这是一个固定写法。 
    $ : 符号表示域,域之间通过默认的分隔符 空格 分开,如果有多个空格就会变成一个空格,第一个域为$1,第二个为$2等…

    打印最后一列:

    [root@admin test]# ls -l | awk '{print $NF}'
    16
    aa.jpg
    ls.jpg
    result.jpg
    right.jpg
    sd.ex
    wrong.jpg
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    $NF : 就代表最后一列的意思。 
    如果想打印倒数第二列,则使用$(NF -1)。

    [root@admin test]# ls -l | awk '{print $(NF - 1)}'
    total
    11:03
    10:48
    11:31
    11:04
    06:39
    11:04
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    -F :参数-F是改变awk的默认分隔符,可以支持正则表达式。

    [root@admin test]# ls -l
    total 16
    -rw-r--r--. 1 root root    0 Jun 15 11:03 aa.jpg
    -rw-r--r--. 1 root root   12 Jun 15 10:48 ls.jpg
    -rw-r--r--. 1 root root  200 Jun 15 11:31 result.jpg
    -rw-r--r--. 1 root root    0 Jun 15 11:04 right.jpg
    drwxr-xr-x. 2 root root 4096 Jun 20 06:39 sd.ex
    -rw-r--r--. 1 root root   49 Jun 15 11:04 wrong.jpg
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    awk默认的分隔符是 空格,空格前一列就是$1,后面是$2,$3….. 
    当我们改变默认分隔符为 分号 “:”时,打印一下结果:

    [root@admin test]# ls -l | awk -F":" '{print $NF}'
    total 16
    03 aa.jpg
    48 ls.jpg
    31 result.jpg
    04 right.jpg
    39 sd.ex
    04 wrong.jpg
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    通过-F 参数改变默认分隔符,以及其支持正则表达式的特性,精确的抽出ifconfig 文件中的ip地址。

    #精确的抽取ip地址
    [root@admin test]# ifconfig | grep "inet addr" | awk -F "addr:|  *" '{print $4}'
    192.168.1.6
    127.0.0.1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 1
    • 2
    • 3
    • 4
    • 5

    分析:

    grep "inet addr" 表示先抽取出含有ip的那行,然后通过管道交给awk去处理
    
    -F "addr:|  *" :表示该变默认分隔符为addr:或者连续多个空格
    
    $4 :表示改变默认分隔符以后,ip地址在第4个域。
    • 1
    • 2
    • 3
    • 4
    • 5
    • 1
    • 2
    • 3
    • 4
    • 5

    用grep实现抽取ip :

    [root@admin home]# ifconfig | egrep -o "[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*"
    192.168.1.6
    192.168.1.255
    255.255.255.0
    127.0.0.1
    255.0.0.0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    然后在用head和tail抽取想要的ip即可。

    使用sed实现抽取ip

    [root@admin home]# ifconfig |grep "inet addr" | sed 's/inet addr://' | sed 's/Bcast.*//' | head -1
    192.168.1.6
    或者:
    [root@admin home]# ifconfig |grep "inet addr" | sed 's/^.*addr://;s/  *.*//' | head -1
    192.168.1.6
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    awk匹配打印

    注:需要匹配的内容是写在{}外面的,通过//来体现匹配。 
    匹配打印实际上是文件每行读取的时候做的处理。

    1、整行中匹配内容

    awk '/sth/{print $1}' ---打印匹配sth的行的第一个域,这是对整行进行操作
    awk '!/sth/{print $1}'  ---打印不匹配sth的行的第一个域
    
    • 1
    • 2
    • 3
    • 1
    • 2
    • 3

    如匹配打印sd关键字:

    [root@admin test]# ls
    aa.jpg  ls.jpg  result.jpg  right.jpg  sd.ex  wrong.jpg
    
    [root@admin test]# ls | awk '/sd/{print $1}'
    sd.ex
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2、域匹配内容 
    匹配某个文件中以默认分隔符分隔的$1域中含有关键字sth的行,然后打印出第一个域,命令如下:

    awk '$1~/sth/{print $1}' 
    • 1
    • 1

    3、改变awk中的默认分隔符 
    如打印出passwd文件中,以冒号 : 分隔的第一个域中含有关键字wcx行的第一个域:

    [root@admin etc]# cat passwd | awk -F":" '$1~/wcx/{print $1}'
    wcx
    
    • 1
    • 2
    • 3
    • 1
    • 2
    • 3

    awk判断打印

    判断打印实际上是文件每行读取后做的处理。 
    格式例如:

    awk '{if($1=="wcx")print $1}'
    • 1
    • 1

    if 判断必须是进入某一行以后才能做的,所以必须是在花括号{} 里面。而模式匹配是先匹配到内容的行才能进行下一步操作,所以模式匹配实在花括号{}外边。

    [root@admin etc]# cat ./passwd | awk -F ":" '{if($1 == "wcx")print}
    wcx:x:501:501::/home/wcx:/bin/bash
    
    • 1
    • 2
    • 3
    • 1
    • 2
    • 3

    上面命令中,如果passwd文件中,以冒号分隔的第一个域==”wcx”,那么就打印出来,这是等于判断,所以只有wcx的行能出来。

    BEGIN和END

    在Unix awk中两个特别的表达式,BEGIN和END,这两者都可用于pattern中(参考前面的awk语法),提供BEGIN和END的作用是给程序赋予初始状态和在程序结束之后执行一些扫尾的工作。 
    任何在BEGIN之后列出的操作(在{}内)将在Unix awk开始扫描输入之前执行,而END之后列出的操作将在扫描完全部的输入之后执行。因此,通常使用BEGIN来显示变量和预置(初始化)变量,使用END来输出最终结果。

    awk的数组

    有一个awk.txt文件,其内容如下:

    [root@admin home]# cat awk.txt
    kk kekea
    jj d32
    jame 23
    sr
    sr
    kk
    jame
    wcx
    jame 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    统计一下awk.txt文件中每个人名出现的次数:

    [root@admin home]# cat awk.txt | awk '{a[$1]++}END{for (i in a)print i,a[i]}'
    wcx 1
    jj 1
    kk 2
    sr 2
    jame 3
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    解题思路分析:

    {a[$1]++} :awk开始扫描管道传过来的内容,但是么有存储功能,现在我们需要计算每个人名出现的额次数,所以需要把扫描到的相同的人名分别存储起来,这时候就必须用数组,并且这里的数组都是hash数组,就是键值对的数组,这里的键—对应的就是对应域中的人名,如kk,值 — 对应的就是kk这个人名出现的次数。数组a中的下标$1代表的是第一个域中列名,如wcx。awk开始逐行扫描,每扫到一个相同的人名,对应的hash数组里的值就+1,如a[kk]++,直到扫到文件的结尾。(注:数组的默认值为空,如果要做++操作了,就会把里的值变成0)

    END : END之后列出的操作将在Unix awk开始扫描完全部的输入之后执行。上面扫描完以后,就开始执行END后面的操作了。

    {for (i in a)print i,a[i]} :利用for循环去遍历刚刚产生的hash数组,然后打印出数组下标所代表的值,也就是人名以及对数组中的值,也就是对应人名出现的次数。这里的i,就代表数组的下标,也就是域中的人名,如kk。

    awk输出分隔符

    awk默认的输出分隔符也是空格,如果想改变默认输出分隔符怎么做?

    [root@admin home]# cat awk.txt | awk '{print $1,$2}'
    kk kekea
    jj d32
    jame 23
    sr 234
    sr edr
    kk 23
    jame rt
    wcx 88
    jame 34
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    运行结果看出,打印时,$1和$2间加了逗号以后,输出的文本中域间就都是用空格隔开的。 
    如果我不加逗号,改为加一串别的字符时,输出后就以加入的字符作为分隔符了。如:

    [root@admin home]# cat awk.txt | awk '{print $1"--"$2"BB"}'
    kk--kekeaBB
    jj--d32BB
    jame--23BB
    sr--234BB
    sr--edrBB
    kk--23BB
    jame--rtBB
    wcx--88BB
    jame--34BB
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    通过awk批量修改扩展名

    [root@admin test]# ls
    aa.jpg  ls.jpg  result.jpg  right.jpg  wrong.jpg
    
    • 1
    • 2
    • 3
    • 1
    • 2
    • 3

    将test目录下的以.jpg结尾的文件改成.txt结尾的文件:

    [root@admin test]# ls | awk -F "." '{print "mv "$1"."$2" "$1".txt"}'|sh
    [root@admin test]# ls
    aa.txt  ls.txt  result.txt  right.txt  wrong.txt
    
    或者:
    [root@admin test]# ls | awk -F "." '{print "mv "$0" "$1".txt"}' | sh
    #$0表示整行的内容
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    思路分析,同样改名也是需要构造mv a.txt a.jpg这样类似的语句的,这就用到了上面讲的输出时修改默认分隔符的操作了。构造出的mv语句再传给sh去执行就可以实现改名的操作。

    展开全文
  • linux awk 命令详解

    2019-07-22 09:55:09
    Linux awk命令详解 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再...

    Linux awk命令详解

    awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

    使用方法   : awk '{pattern + action}' {filenames}

    尽管操作可能会很复杂,但语法总是这样,其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。

    awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。

    awk内置变量

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    ARGC               命令行参数个数

    ARGV               命令行参数排列

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

    FILENAME           awk浏览的文件名

    FNR                浏览文件的记录数

    FS                 设置输入域分隔符,等价于命令行 -F选项

    NF                 浏览记录的域的个数

    NR                 已读的记录数

    OFS                输出域分隔符

    ORS                输出记录分隔符

    RS                 控制记录分隔符

    $0变量是指整条记录。$1表示当前行的第一个域,$2表示当前行的第二个域,......以此类推。

    1

    $NF是number finally,表示最后一列的信息,跟变量NF是有区别的,变量NF统计的是每行列的总数

     

    常用的命令展示

    awk擅长列输出

    搜索/etc/passwd有root关键字的所有行

    1

    awk  '/root/' /etc/passwd 【这种是pattern的使用,匹配了pattern(这里是root)的行才会执行action(没有指定action,默认输出每行的内容)】

    image

    搜索/etc/passwd有root关键字的所有行,并显示对应的shell

    1

    awk -F: '/root/ {print $7}' /etc/passwd

    image

     

    统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容:

    1

    awk  -F ':'  '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd

    image

    使用printf替代print,可以让代码更加简洁,易读

    1

    awk -F: '{printf ("filename:%10s, linenumber:%3s,column:%3s,content:%3f\n",FILENAME,NR,NF,$0)}' /etc/passwd

    image

    打印/etc/passwd/的第二行信息

    1

    awk -F: 'NR==2{print "filename: "FILENAME, $0}' /etc/passwd

    image

     

    awk的过滤使用方法

    1

    ls -lF | awk '/^d/'

    image
    指定特定的分隔符,查询第一列

    1

    awk -F ":" '{print $1}' /etc/passwd

    image
    指定特定的分隔符,查询最后一列

    1

    awk -F ":" '{print $NF}' /etc/passwd

    image
    指定特定的分隔符,查询倒数第二列

    1

    awk -F ":" '{print $NF-1}' /etc/passwd

    image
    获取第12到31行的第一列的信息

    1

    awk -F ":"  '{if(NR<31 && NR >12) print $1}' /etc/passwd

    image

    多分隔符的使用:

    1

    2

    [root@localhost ftl]# awk -F "[/]" 'NR == 4 {print $0,"\n",$1}' /etc/passwd

    这里以/为分隔符,多个分隔符利用[]然后在里面写分隔符即可

    image

    添加了BEGIN和END

    1

    [root@localhost ftl]# cat /etc/passwd | awk -F: 'BEGIN{print "name, shell"} {print $1,$NF} END{print "hello  world"}'

    image

    查看最近登录最多的IP信息

    1

    [root@localhost ftl]# last | awk '{S[$3]++} END{for(a in S ) {print S[a],a}}' |uniq| sort -rh

    image

     利用正则过滤多个空格

    1

    [root@localhost ~]# ifconfig |grep eth* | awk -F '[ ]+' '{print $1}'<br><br>

     

    awk编程--变量和赋值

    除了awk的内置变量,awk还可以自定义变量, awk中的循环语句同样借鉴于C语言,支持while、do/while、for、break、continue,这些关键字的语义和C语言中的语义完全相同。

    统计某个文件夹下的大于100k文件的数量和总和

    1

    2

    ls -l|awk '{if($5>100){count++; sum+=$5}} {print "Count:" count,"Sum: " sum}'  【因为awk会轮询统计,所以会显示整个过程】

    ls -l|awk '{if($5>100){count++; sum+=$5}} END{print "Count:" count,"Sum: " sum}' 【天界END后只显示最后的结果】

    1

    <strong>备注:</strong>count是自定义变量。之前的action{}里都是只有一个print,其实print只是一个语句,而action{}可以有多个语句,以;号隔开

    image

    统计显示/etc/passwd的账户

    1

    2

    3

    awk -F: '{count++;} END{print count}' /etc/passwd        

    cat /etc/passwd|wc -l

    awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd

    image

     

    展开全文
  • Linux awk命令详解

    千次阅读 2010-08-26 20:18:00
    Linux awk命令详解

    AWK介绍
    0.awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk。
    1.awk语言的最基本功能是在文件或字符串中基于指定规则来分解抽取信息,也可以基于指定的规则来输出数据。完整的awk脚本通常用来格式化文本文件中 的信息。
    2.三种方式调用awk
    1) awk [opion] 'awk_script' input_file1 [input_file2 ...]
    awk的常用选项option有;
    ① -F fs : 使用fs作为输入记录的字段分隔符,如果省略该选项,awk使用环境变量IFS的值
    ② -f filename : 从文件filename中读取awk_script
    ③ -v var=value : 为awk_script设置变量
    2) 将awk_script放入脚本文件并以 #!/bin/awk -f 作为首行,给予该脚本可执行权限,然后在shell下通过键入该脚本的脚本名调用之。
    3) 将所有的awk_script插入一个单独脚本文件,然后调用: awk -f awk脚本文件 input_file(s)

    3. awk的运行过程
    1) awk_script的组成:
    ① awk_script可以由一条或多条awk_cmd组成,两条awk_cmd之间一般以NEWLINE分隔
    ② awk_cmd由两部分组成: awk_pattern { actions }
    ③ awk_script可以被分成多行书写,必须确保整个awk_script被单引号括起来。
    2) awk命令的一般形式:
    awk ' BEGIN { actions }
    awk_pattern1 { actions }
    ............
    awk_patternN { actions }
    END { actions }
    ' inputfile
    其中 BEGIN { actions } 和 END { actions } 是可选的。
    3) awk的运行过程:
    ① 如果BEGIN 区块存在,awk执行它指定的actions。
    ② awk从输入文件中读取一行,称为一条输入记录。(如果输入文件省略,将从标准输入读取)
    ③ awk将读入的记录分割成字段,将第1个字段放入变量$1中,第2个字段放入$2,以此类推。$0表示整条记录。字段分隔符使用shell环境变量IFS 或由参数指定。
    ④ 把当前输入记录依次与每一个awk_cmd中awk_pattern比较,看是否匹配,如果相匹配,就执行对应的actions。如果不匹配,就跳过对应 的actions,直到比较完所有的awk_cmd。
    ⑤ 当一条输入记录比较了所有的awk_cmd后,awk读取输入的下一行,继续重复步骤③和④,这个过程一直持续,直到awk读取到文件尾。
    ⑥ 当awk读完所有的输入行后,如果存在END,就执行相应的actions。

    4) iput_file可以是多于一个文件的文件列表,awk将按顺序处理列表中的每个文件。
    5) 一条awk_cmd的awk_pattern可以省略,省略时不对输入记录进行匹配比较就执行相应的actions。一条awk_cmd的actions 也可以省略,省略时默认的动作为打印当前输入记录(print $0) 。一条awk_cmd中的awk_pattern和actions不能同时省略。
    6) BEGIN区块和END区块别位于awk_script的开头和结尾。awk_script中只有END区块或者只有BEGIN区块是被允许的。如果 awk_script中只有BEGIN { actions } ,awk不会读取input_file。
    7) awk把输入文件的数据读入内存,然后操作内存中的输入数据副本,awk不会修改输入文件的内容。
    8) awk的总是输出到标准输出,如果想让awk输出到文件,可以使用重定向。

    4.awk_pattern
    awk_pattern模式部分决定actions动作部分何时触发及触发actions。awk_pattern可以是以下几种类型:
    1) 正则表达式用作awk_pattern: /regexp/
    ① awk中正则表达式匹配操作中经常用到的字符:
    / ^ $ . [] | () * // 通用的regexp元字符
    + : 匹配其前的单个字符一次以上,是awk自有的元字符,不适用于grep或sed等
    ? : 匹配其前的单个字符1次或0次,是awk自有的元字符,不适用于grep或sed等
    ② 举例:
    awk '/ */$0/.[0-9][0-9].*/' input_file
    2) 布尔表达式用作awk_pattern,表达式成立时,触发相应的actions执行。
    ① 表达式中可以使用变量(如字段变量$1,$2等)和/regexp/
    ② 布尔表达式中的操作符:
    关系操作符: < > <= >= == !=
    匹配操作符: value ~ /regexp/ 如果value匹配/regexp/,则返回真
    value !~ /regexp/ 如果value不匹配/regexp/,则返回真
    举例: awk '$2 > 10 {print "ok"}' input_file
    awk '$3 ~ /^d/ {print "ok"}' input_file
    ③ &&(与) 和 ||(或) 可以连接两个/regexp/或者布尔表达式,构成混合表达式。!(非) 可以用于布尔表达式或者/regexp/之前。
    举例: awk '($1 < 10 ) && ($2 > 10) {print "ok"}' input_file
    awk '/^d/ || /x$/ {print "ok"}' input_file
    ④ 其它表达式用作awk_script,如赋值表达式等
    eg: awk '(tot+=$6); END{print "total points :" tot }' input_file // 分号不能省略
    awk 'tot+=$6 {print $0} END{print "total points :" tot }' input_file // 与上面等效

    awk 用法例举:
    变量名 含义
    ARGC 命令行变元个数
    ARGV 命令行变元数组
    FILENAME 当前输入文件名
    FNR 当前文件中的记录号
    FS 输入域分隔符,默认为一个空格
    RS 输入记录分隔符
    NF 当前记录里域个数
    NR 到目前为止记录数
    OFS 输出域分隔符
    ORS 输出记录分隔符

    1、awk '/101/' file 显示文件file中包含101的匹配行。
    awk '/101/,/105/' file
    awk '$1 == 5' file
    awk '$1 == "CT"' file 注意必须带双引号
    awk '$1 * $2 >100 ' file
    awk '$2 >5 && $2<=15' file
    2、awk '{print NR,NF,$1,$NF,}' file 显示文件file的当前记录号、域数和每一行的第一个和最后一个域。
    awk '/101/ {print $1,$2 + 10}' file 显示文件file的匹配行的第二个域加10。
    awk '/101/ {print $1$2}' file
    awk '/101/ {print $1 $2}' file 显示文件file的匹配行的第一、二个域,但显示时域中间没有分隔符。
    3、df | awk '$4>1000000 ' 通过管道符获得输入,如:显示第4个域满足条件的行。
    4、awk -F "|" '{print $1}' file 按照新的分隔符“|”进行操作。
    awk 'BEGIN { FS="[: /t|]" }
    {print $1,$2,$3}' file 通过设置输入分隔符(FS="[: /t|]")修改输入分隔符。

    Sep="|"
    awk -F $Sep '{print $1}' file 按照环境变量Sep的值做为分隔符。
    awk -F '[ :/t|]' '{print $1}' file 按照正则表达式的值做为分隔符,这里代表空格、:、TAB、|同时做为分隔符。
    awk -F '[][]' '{print $1}' file 按照正则表达式的值做为分隔符,这里代表[、]
    5、awk -f awkfile file 通过文件awkfile的内容依次进行控制。
    cat awkfile
    /101/{print "/047 Hello! /047"} --遇到匹配行以后打印 ' Hello! './047代表单引号。
    {print $1,$2} --因为没有模式控制,打印每一行的前两个域。
    6、awk '$1 ~ /101/ {print $1}' file 显示文件中第一个域匹配101的行(记录)。
    7、awk 'BEGIN { OFS="%"}
    {print $1,$2}' file 通过设置输出分隔符(OFS="%")修改输出格式。
    8、awk 'BEGIN { max=100 ;print "max=" max} BEGIN 表示在处理任意行之前进行的操作。
    {max=($1 >max ?$1:max); print $1,"Now max is "max}' file 取得文件第一个域的最大值。
    (表达式1?表达式2:表达式3 相当于:
    if (表达式1)
    表达式2
    else
    表达式3
    awk '{print ($1>4 ? "high "$1: "low "$1)}' file
    9、awk '$1 * $2 >100 {print $1}' file 显示文件中第一个域匹配101的行(记录)。
    10、awk '{$1 == 'Chi' {$3 = 'China'; print}' file 找到匹配行后先将第3个域替换后再显示该行(记录)。
    awk '{$7 %= 3; print $7}' file 将第7域被3除,并将余数赋给第7域再打印。
    11、awk '/tom/ {wage=$2+$3; printf wage}' file 找到匹配行后为变量wage赋值并打印该变量。
    12、awk '/tom/ {count++;}
    END {print "tom was found "count" times"}' file END表示在所有输入行处理完后进行处理。
    13、awk 'gsub(//$/,"");gsub(/,/,""); cost+=$4;
    END {print "The total is $" cost>"filename"}' file gsub函数用空串替换$和,再将结果输出到filename中。
    1 2 3 $1,200.00
    1 2 3 $2,300.00
    1 2 3 $4,000.00

    awk '{gsub(//$/,"");gsub(/,/,"");
    if ($4>1000&&$4<2000) c1+=$4;
    else if ($4>2000&&$4<3000) c2+=$4;
    else if ($4>3000&&$4<4000) c3+=$4;
    else c4+=$4; }
    END {printf "c1=[%d];c2=[%d];c3=[%d];c4=[%d]/n",c1,c2,c3,c4}"' file
    通过if和else if完成条件语句

    awk '{gsub(//$/,"");gsub(/,/,"");
    if ($4>3000&&$4<4000) exit;
    else c4+=$4; }
    END {printf "c1=[%d];c2=[%d];c3=[%d];c4=[%d]/n",c1,c2,c3,c4}"' file
    通过exit在某条件时退出,但是仍执行END操作。
    awk '{gsub(//$/,"");gsub(/,/,"");
    if ($4>3000) next;
    else c4+=$4; }
    END {printf "c4=[%d]/n",c4}"' file
    通过next在某条件时跳过该行,对下一行执行操作。


    14、awk '{ print FILENAME,$0 }' file1 file2 file3>fileall 把file1、file2、file3的文件内容全部写到fileall中,格式为
    打印文件并前置文件名。
    15、awk ' $1!=previous { close(previous); previous=$1 }
    {print substr($0,index($0," ") +1)>$1}' fileall 把合并后的文件重新分拆为3个文件。并与原文件一致。
    16、awk 'BEGIN {"date"|getline d; print d}' 通过管道把date的执行结果送给getline,并赋给变量d,然后打印。
    17、awk 'BEGIN {system("echo "Input your name://c""); getline d;print "/nYour name is",d,"/b!/n"}'
    通过getline命令交互输入name,并显示出来。
    awk 'BEGIN {FS=":"; while(getline< "/etc/passwd" >0) { if($1~"050[0-9]_") print $1}}'
    打印/etc/passwd文件中用户名包含050x_的用户名。

    18、awk '{ i=1;while(i<NF) {print NF,$i;i++}}' file 通过while语句实现循环。
    awk '{ for(i=1;i<NF;i++) {print NF,$i}}' file 通过for语句实现循环。
    type file|awk -F "/" '
    { for(i=1;i<NF;i++)
    { if(i==NF-1) { printf "%s",$i }
    else { printf "%s/",$i } }}' 显示一个文件的全路径。
    用for和if显示日期
    awk 'BEGIN {
    for(j=1;j<=12;j++)
    { flag=0;
    printf "/n%d月份/n",j;
    for(i=1;i<=31;i++)
    {
    if (j==2&&i>28) flag=1;
    if ((j==4||j==6||j==9||j==11)&&i>30) flag=1;
    if (flag==0) {printf "%02d%02d ",j,i}
    }
    }
    }'
    19、在awk中调用系统变量必须用单引号,如果是双引号,则表示字符串
    Flag=abcd
    awk '{print '$Flag'}' 结果为abcd
    awk '{print "$Flag"}' 结果为$Flag

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,343
精华内容 537
关键字:

linuxawk命令详解

linux 订阅