• linux awk简单用法


    awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。

    语法形式:

    awk [options] 'script' var=value file(s)
    awk [options] -f scriptfile var=value file(s)
    

    常用命令选项

    1. -F fs   fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:
    2. -v var=value   赋值一个用户定义变量,将外部变量传递给awk
    3. -f scripfile  从脚本文件中读取awk命令
    4. -m[fr] val   对val值设置内在限制,-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用

    模式

    1. /正则表达式/:使用通配符的扩展集。
    2. 关系表达式:使用运算符进行操作,可以是字符串或数字的比较测试。
    3. 模式匹配表达式:用运算符~(匹配)和~!(不匹配)。
    4. BEGIN语句块、pattern语句块、END语句块

    操作由一个或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内,主要部分是:

    1. 变量或数组赋值
    2. 输出命令
    3. 内置函数
    4. 控制流语句

    awk脚本基本结构:

    awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file
    例:
    一个awk脚本通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块3部分组成,这三个部分是可选的。任意一个部分都可以不出现在脚本中,脚本通常是被单引号双引号
    awk 'BEGIN{ i=0 } { i++ } END{ print i }' filename
    awk "BEGIN{ i=0 } { i++ } END{ print i }" filename

    awk工作原理:

    awk 'BEGIN{ commands } pattern{ commands } END{ commands }'
    
    1. 第一步:执行BEGIN{ commands }语句块中的语句;
    2. 第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
    3. 第三步:当读至输入流末尾时,执行END{ commands }语句块。

    BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。

    END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。

    pattern语句块中的通用命令是最重要的部分,它也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块。

    内置变量

    说明:[A][N][P][G]表示第一个支持变量的工具,[A]=awk、[N]=nawk、[P]=POSIXawk、[G]=gawk
    $n 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段。 $0 这个变量包含执行过程中当前行的文本内容。 [N] ARGC 命令行参数的数目。 [G] ARGIND 命令行中当前文件的位置(从0开始算)。 [N] ARGV 包含命令行参数的数组。 [G] CONVFMT 数字转换格式(默认值为%.6g)。 [P] ENVIRON 环境变量关联数组。 [N] ERRNO 最后一个系统错误的描述。 [G] FIELDWIDTHS 字段宽度列表(用空格键分隔)。 [A] FILENAME 当前输入文件的名。 [P] FNR 同NR,但相对于当前文件。 [A] FS 字段分隔符(默认是任何空格)。 [G] IGNORECASE 如果为真,则进行忽略大小写的匹配。 [A] NF 表示字段数,在执行过程中对应于当前的字段数。 [A] NR 表示记录数,在执行过程中对应于当前的行号。 [A] OFMT 数字的输出格式(默认值是%.6g)。 [A] OFS 输出字段分隔符(默认值是一个空格)。 [A] ORS 输出记录分隔符(默认值是一个换行符)。 [A] RS 记录分隔符(默认是一个换行符)。 [N] RSTART 由match函数所匹配的字符串的第一个位置。 [N] RLENGTH 由match函数所匹配的字符串的长度。 [N] SUBSEP 数组下标分隔符(默认值是34)。

    使用print $NF可以打印出一行中的最后一个字段,使用$(NF-1)则是打印倒数第二个字段,其他以此类推

    一个每一行中第一个字段值累加的例子:

    seq 5 | awk 'BEGIN{ sum=0; print "总和:" } { print $1"+"; sum+=$1 } END{ print "等于"; print sum }' 
    总和:
    1+
    2+
    3+
    4+
    5+
    等于
    15

    遍历计数,文件中所以字段出现次数:

    /dev/mapper/centos-root /                       xfs     defaults        0 0
    UUID=471b8830-f6fc-4157-9004-5660a64cb25b /boot                   xfs     defaults        0 0
    /dev/mapper/centos-home /home                   xfs     defaults        0 0
    /dev/mapper/centos-swap swap                    swap    defaults        0 0
    [root@localhost ~]# awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count){print i,count[i]}}' /etc/fstab 
    END遍历所以行,第一个for遍历一行中的每一个字段,这样就完成了全文遍历 18:12:55 1 man 1 and/or 1 maintained 1 xfs 3 /dev/mapper/centos-root 1 Accessible 1 # 7

    开发Shell脚本判断系统根分区剩余空间的大小,如果低于1000MB就提示不足,否则提示充足。

    kongjian=`df -h|grep "/dev/sda1" |awk '{print $4}'|cut -d"M" -f 1`
    if [ $kongjian -lt 1000 ];then
            echo "内存不足了熬"
    else
            echo "内存充足熬"
    fi
    

      

    遍历计数,每一行中某一列的字段出现次数:

    172.16.100.153 - - [22/Aug/2019:14:53:16 +0800] "GET /centos7/Packages/iwl3945-firmware-15.32.2.9-56.el7.noarch.rpm HTTP/1.1" 200 92000 "-" "urlgrabber/3.10 yum/3.4.3"
    172.16.100.153 - - [22/Aug/2019:14:53:16 +0800] "GET /centos7/Packages/iwl6000-firmware-9.221.4.1-56.el7.noarch.rpm HTTP/1.1" 200 172668 "-" "urlgrabber/3.10 yum/3.4.3"
    [root@localhost ~]# awk '{http_ac[$4]++}END{for(i in http_ac){print i,http_ac[i]}}' /var/log/httpd/access_log 
    取文件中第4列,利用awk逐行,end读取所有行后继续执行,也就是取到了一个数组,以取到的字符串为角标,
    数组内容由自加产生,为次数,for循环从数组中读取次数输出
    [22/Aug/2019:14:49:59 1 [22/Aug/2019:14:50:30 7 [22/Aug/2019:14:50:31 13 [22/Aug/2019:14:36:41 40 [22/Aug/2019:14:36:42 125 [22/Aug/2019:14:36:43 166 [22/Aug/2019:14:36:44 153
      

  • 相关阅读:
    前端发版后清理浏览器缓存处理
    CF235A 【LCM Challenge】
    CF39H 【Multiplication Table】
    CF171C 【A Piece of Cake】
    CF450A 【Jzzhu and Children】
    CF387B 【George and Round】
    火柴棒等式
    P1062 数列 题解
    P1045 麦森数
    (原创)最短路径那些事-1
  • 原文地址:https://www.cnblogs.com/abels0025/p/11395016.html
Copyright © 2020-2023  润新知