linux 下的gawk

    xiaoxiao2021-04-11  39

    gawk:Unix中原始awk程序的GNU版本,强大之处在于可以写脚本来读取文本行的数据,然后处理并显示数据。 命令格式:gawk options program file 一、gawk基础 1.命令行读取程序脚本 # gawk '{print "hello world"}'           //gawk假定脚本是单个文本字符串,须将脚本放到单引号中 hello hello world hi hello world 2.数据字段变量 文本行中发现的数据元素使用$0、$1等来分配变量 $0代表整个文本行 $1代表文本行中的第1个数据字段,$2等依次类推 默认分隔符为空白字符 # gawk '{print $1}' data1 this # gawk -F: '{print $1}' passwd                                   //使用-F来指定字段分隔符 root bin daemon adm 3.使用多个命令 # echo "this is a test" | gawk '{$4="gawk";print $0}'            //使用;号隔开 this is a gawk 4.从文件中读取程序 # cat gawktest  { text="'s home directory is " print $1 text $6                                                 //gawk程序中使用变量无需加美元符 } # gawk -F: -f gawktest passwd  root's home directory is /root bin's home directory is /bin daemon's home directory is /sbin adm's home directory is /var/adm 5.BEGIN与END # cat beginend  BEGIN {                                            //BEGIN处理数据前运行的脚本 print "userid   shell" print "------   -----" FS=":"                                             //FS脚本中定义分隔符 } { print $1 "      " $7                               //引号内为制表符,这样输出的结果才能对齐 } END {                                              //END处理数据后运行的脚本 print "end of list" } # gawk -f beginend passwd  userid  shell ------  ----- root    /bin/bash bin     /sbin/nologin daemon  /sbin/nologin adm     /sbin/nologi ... end of list 二、gawk进阶 1.使用变量 1)内建变量 FIELDWIDTHS              由空格分隔开的定义了每个数据字段确切宽度的一列数字 FS                       输入字段分隔符 RS                       输入数据行分隔符 OFS                      输出字段分隔符 ORS                      输出数据行分隔符 # cat data1 data1.data2.data3 data4.data5.data6 # gawk 'BEGIN{FS=".";OFS="-"} {print $1,$2,$3}' data1 data1-data2-data3 data4-data5-data6 # cat datanumber  1234.567.827                           //使用了FIELDWIDTHS变量,gawk会忽略FS变量,一旦设置不能改变 # gawk 'BEGIN{FIELDWIDTHS="1 2 3 4"} {print $1,$2,$3,$4}' datanumber  1 23 4.5 67.8 2.数据变量 ARGC                      当前命令行参数个数 ARGV                      包含命令行参数的数组 ENVIRON                   当前shell环境变量及其值组成的关联数组 FNR                       当前数据文件中的数据行数 NF                        数据文件中的字段总数 NR                        已处理的输入数据行数目 # gawk 'BEGIN{print ARGC,ARGV[0]}' data1            //引用gawk变量,不用加$符号 2 gawk ]# gawk ' > BEGIN{ > print ENVIRON["HOME"]                             //提取HOME变量 > print ENVIRON["PATH"] > }' /root /usr/local/program/jdk1.6.0_33/bin # gawk 'BEGIN{FS=":";OFS="-"} {print $1,$NF}' passwd         //NF指定数据行中的最后一个数据字段 root-/bin/bash bin-/sbin/nologin daemon-/sbin/nologin 3.自定义变量 # cat script1  #!/bin/bash BEGIN{print "the n value is",n;FS="."} {print $n} # gawk -f script1 n=3 data1 the n value is  data3 data6 # gawk -v n=3 -f script1 data1                    //BEGIN代码之前设定的变量需要用-v参数指定 the n value is 3 data3 data6 4.处理数组 1)定义数组                         //与哈希表类似 格式: var[index]= element        # gawk 'BEGIN{ > capital["shanghai"]="shanghai" > print capital["shanghai"] > }' shanghai    2)遍历数组 # gawk 'BEGIN{ > var["g"]=1 > var["a"]=2 > var["w"]=3 > var["k"]=4 > for(test in var) > { >    print "index:",test," - value:",var[test]                //中间有逗号 > } > }' index: w  - value: 3                                //输出值只能保证一一对应,不能按顺序 index: k  - value: 4 index: a  - value: 2 index: g  - value: 1 3)删除数组 # cat script2 #!/bin/bash BEGIN{ var["g"]=1 var["a"]=2 var["w"]=3 var["k"]=4 for(test in var) {    print "index:",test," - value:",var[test] } delete var["a"]                             //删除指定数组中的数据元素 print "---" for(test in var) {    print "index:",test," - value:",var[test] } } # gawk -f script2 index: w  - value: 3 index: k  - value: 4 index: a  - value: 2 index: g  - value: 1 --- index: w  - value: 3 index: k  - value: 4 index: g  - value: 1 5.使用模式 1)正则表达式 # gawk 'BEGIN{FS="."} /1/{print $1}' data1            //匹配data1文件中含有1的 data1 2)匹配操作符 波浪线~,匹配操作符可以将正则表达式限定在数据行中的特一数据字段 # gawk -F: '$1 ~ /root/{print $1,$NF}' passwd               //查找第一个数据字段中匹配root的数据 root /bin/bash # gawk -F: '$1 !~ /root/{print $1,$NF}' passwd               //波浪线前加!号,排除匹配到的数据 bin /sbin/nologin daemon /sbin/nologin adm /sbin/nologin lp /sbin/nologin sync /bin/sync shutdown /sbin/shutdown 3)数学表达式 可以使用普通数学表达式,x == y; x<=y;x>y 等等 # gawk -F: '$4 == 0{print $1}' passwd            //查找第四个数据字段为0,即属于root用户组的用户 root sync shutdown halt operator 6.结构化命令 1)if语句 # cat script3 #!/bin/bash { if ($1 <5) {    x = $1 + 20    print x } else {    x = $1 + 30    print x } } # gawk -f script3 dataif  21 22 23 24 35 36 37 38 2)while语句 # cat datawhile  12 13 14 45 56 78 22 33 44 # cat script4 #!/bin/bash { total=0 i=1 while (i<4) {    total += $i    i++ } avg = total / 3 print "avg:",avg } # gawk -f script4 datawhile  avg: 13 avg: 59.6667 avg: 33 3)for语句 # cat script5 #!/bin/bash #!/bin/bash { total=0 i=1 for (i=1;i<4;i++) {    total += $i } avg = total / 3 print "avg:",avg } 7.格式化输出 printf格式化输出 c          将一个数作为ASCII字符显示 d          显示一个整数值 e          科学计数法显示 f          显示浮点数 o          显示一个八进制值 s          显示一个文本字符串 x          显示一个十六进制值 X          显示一个十六进制值,但用大写字母A-F # cat script5 #!/bin/bash #!/bin/bash { total=0 i=1 for (i=1;i<4;i++) {    total += $i } avg = total / 3 printf "avg: %5.1f\n",avg              //近似到小数点1位 } 8.内建函数 gawk提供了一些内置函数 1)数学函数 exp(x)      x的指数函数 int(x)      x的整数部分 rand()      0至1之间的随机浮点数 x=int(10 * rand()) 2) 字符串函数 asort(s [,d])           将数组s按数据元素值排序 index(s,t)              返回字符串t在字符串s中的索引值 length([s])             返回字符串s的长度 3)时间函数 mktime(datespec)        将一个按YYYY MM DD HH MM SS格式的日期转换成时间戳 systime()               返回当前时间的时间戳 strftime(format [,timestamp])         将时间戳转成date()格式化日期 # gawk 'BEGIN{ > date = systime() > day = strftime("%A,%B %d,%Y",date) > print day > }' Sunday,December 22,2013
    转载请注明原文地址: https://ju.6miu.com/read-666725.html

    最新回复(0)