ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 【转】awk 实例手册

【转】awk 实例手册

原创 Linux操作系统 作者:ljm0211 时间:2012-06-20 18:01:25 0 删除 编辑

awk 用法:awk ' pattern {action} '
变量名 含义
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 && $21000000 '         通过管道符获得输入,如:显示第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 { fs="%"}
{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&&$42000&&$43000&&$43000&&$43000) 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(getline0) { if($1~"050[0-9]_") print $1}}'
   打印/etc/passwd文件中用户名包含050x_的用户名。
18、awk '{ i=1;while(i28) 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

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/11411056/viewspace-733480/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: awk命令部分用法
请登录后发表评论 登录
全部评论

注册时间:2009-05-14

  • 博文量
    272
  • 访问量
    491392