awk 总结

说明:本文源于“朱双印博客”,原文地址:http://www.zsythink.net/archives/tag/awk

awk 命令:

  综合:
    awk功能是对“文本”进行格式化输出,形成报表;awk一行一行的处理文本。

   awk -- 功能:
    awk功能,对文本进行格式化输出,形成报表;根据原始文档,使用awk命令,产生新的报表;

  awk -- 命令格式:
    awk [options] ‘program‘ file1, file2, ...fileN
    awk [options] ‘Pattern {Action}‘ file1, file2, ...fileN

  awk -- 命令说明:

    1、Pattern 指 “条件”,相当于“输出的过滤条件”

    2、action 指 “动作”,常用动作是“ print, printf ”;

    3、当 action 中包含多条语句,使用逗号“;”分隔;

awk -- 说明:

1、双引号("")中的内容,按照原样输出;单引号(‘‘)中表示program。

2、内置变量 ( $0, $1, $2,... ,$NF ):

  $0 -- 表示输出“整行”;

  $NF -- 表示 当前行分割后的最后一列;

  $1 , $2, ... -- 表示行的第“1”列;

3、 awk -- Pattern

  BEGIN - 在处理文本之前,执行的操作;

  END - 在处理文本以后,执行的操作;

4、awk -- 分隔符:

  a、分隔符:输入分隔符

    输入分隔符,field separator,简称 FS。
    输入分隔符,awk以“空格”为默认的分隔符,用“空格”对每一列进行分隔;
    输入分隔符,对文件输出时,用什么“符号”将“以整个字符串作为一行的文本”分割成若干列

      举例1:选项形式,“-F”选项指定分隔符: "-F#",在"docs.txt"中,每行的“#”符号为列分隔符;
        awk -F# ‘{print $1,$2,$3}‘ docs.txt

      举例2:变量形式,“ -v FS=‘#‘ ”,指定分隔符:
        awk -v FS=‘#‘ ‘{print $1,$2,$3}‘ docs.txt

  b、分隔符:输出分隔符

    输出分隔符,output field seperator,简称OFS。

    输出分隔符:对文本进行输出时,用指定的“符号”分隔“原始文件的每一列”;

      举例1:以变量形式,指定输出文本分隔符。
        awk -v OFS=‘@@@‘ ‘{print $1,$2,$3}‘ docs.txt

  c、总结:输入输出分隔符:

    使用“输入分隔符”,将“以整个字符串为行的文本”分割成若干个“列”;

    使用“输出分隔符”,将“指定的分隔符”替换“空格分隔符”,输出文本;

5、 下面两个命令的区别:有逗号,两列分开显示;无逗号,两列合成一列显示。

  awk ‘{ print $1, $2}‘ docs.txt 两列分开显示;

  awk ‘{ print $1 $2}‘ docs.txt 将两列合成一列以后,显示;

6、awk -- 变量:

  变量:分为“内置变量”和“自定义变量”;

  a、内置变量:

    内置变量:

      RS-将“指定的分隔符” 作为“行”的分隔符,分隔输入的文件;

      ORS-将“指定的分隔符”替换“原始的‘行’分隔符”;

      FS-将“指定的分隔符” 作为“列”的分隔符;分隔输入的文件;
      OFS-将“指定的分隔符” 替换“原始的‘列’分隔符”;

      NF:Number of Field,当前行的共有多少列(即当前行被分割成了几列);
      NR:Number of Row,当前的行号,当前处理的文本的行号;
      FNR:各个文件分别显示行号;
      FILENAME:当前文件名;
      ARGC:命令行参数的个数;
      ARGV:数组,保存的 是命令行所给定的各个参数;

        实例:
          1、显示所指定的文件的“行数,每行有多少列”:
            awk ‘{ print NR, NF}‘ file1, file2, ...
            awk ‘{ print "abc", ARGC,ARGV[1], ARGV[2]}‘ file1, file2, ...

          2、 RS-将“指定的分隔符” 作为“行”的分隔符,分隔输入的文件;
            ORS-将“指定的分隔符”替换“原始的‘行’分隔符”;
            FS-将“指定的分隔符” 作为“列”的分隔符;分隔输入的文件;
            OFS-将“指定的分隔符” 替换“原始的‘列’分隔符”;

            举例:
              RS:awk -v RS=‘@@@‘ ‘{ print $1, $2}‘ file.txt
              ORS:awk -v ORS=‘@@@‘ ‘{ print $1, $2}‘ file.txt
              FS:awk -v FS=‘@@@‘ ‘{ print $1, $2}‘ file.txt
              OFS:awk -v OFS=‘@@@‘ ‘{ print $1, $2}‘ file.txt
              重点:awk -v FS=‘@‘ -v OFS=‘#‘ ‘{ print $1, $2}‘ file.txt

  b、自定义变量:

    自定义内置变量的方法:
      方法一: -v varname=value 变量名区分大小写;
      方法二: 在"program"中定义自变量,
        (awk [option] ‘ program ‘ file)
        (awk [option] ‘Pattern {Action}‘ file);

        实例:
          举例1:自定义变量,方法一;
            awk -v myvar1="hello world" ‘{ print myvar1}‘ docs.txt
            awk -v myvar1="hello houdini" -v myvar2="hello world" ‘{ print myvar1,myvar2}‘ docs.txt

          举例2:在“ program ” 中定义,自变量;定义多个自变量时,用“;”分隔;
            awk ‘{ name="china"; print NR ,name}‘ docs.txt
            awk ‘{ name="china";age="39"; print NR, name, age}‘ docs.txt

7、awk -- 格式化:

  a、print 不支持格式化输出:
    用法: print var1, var2, var3, ...

  b、printf 支持格式化输出:
    用法: printf "格式化字符串", var1, var2, var3, ...
      实例: awk ‘{ printf " 1:%s 2:%s 3:%s \n", $1, $2, $3}‘ docs.txt

    说明:awk中使用printf动作是注意3点。
      a、printf动作输出的文本不会换行;想换行,必须使用格式化字符串"\n";
      b、printf动作,“格式化字符串”与“字段($1, $2等)”之间,用逗号","分隔;
      c、printf动作,“格式替换符”必须与“字段($1,$2,...)”之间“一一对应”;

8、awk -- Pattern

  a、综述:
    Pattern 译为 “ 模式 ”;只有与“模式”匹配的行,才会执行 “ 动作 ”。
    Pattern 相当于每行的“过滤条件”;只有满足 “Pattern 条件”的行,才会执行 “Action”。

  b、模式分类:

    -- 空模式;
        实例: awk ‘ { action }‘ docs.txt
    -- 关系模式;
      -- <, <=; >, >=; ==, !=;
      -- ~(与正则表达式匹配,表达式为“真”), !~(与正则表达式不匹配,表达式为真)

    -- BEGIN/END模式;

    -- 正则模式;
      -- 功能:对文本内容,与“正则表达式”匹配。
        -- awk ‘/正则表达式/ { action }‘ file1,...
      -- 正则表达式包含"/",用"\"进行转义处理;
        -- awk ‘/ \/bin\/ / { print }‘ docs.txt
          -- 说明:"/"转义处理;显示,文件docs.txt中包含字符串“/bin/”的行;
        -- awk ‘/ \\zhao / {print }‘ docs.txt
          -- 说明:"\"转义处理;显示,文件docs.txt中包含字符串“\zhao”的行

    --注意事项:
      -- awk 使用“扩展正则表达式”;
      -- {x,y},需要使用"--posix"或"--re-interval"选项;
      -- :awk --posix ‘/ [[:alpha:]]{1,3} / {print }‘ docs.txt;
        -- 说明:显示,文件docs.txt中包含1~3个字母的字符串的行;
      -- :awk --re-interval ‘/[[:alpha:]]{1,3} / {print }‘ docs.txt
        -- 说明:显示,文件docs.txt中包含1~3个字母的字符串的行;

    -- 行范围模式;

      -- 语法格式:
        -- awk ‘/正则表达式1/,/正则表达式2/ {action}‘ file1, ...

      -- 功能:从第一次匹配“正则表达式1”的行开始,到第一次“正则表达式2”的行结束;
          此区间的所有行,都会执行此语法的“动作”。

  c、实例:
    -- 空模式(无任何条件,每行都会执行“动作”):
      --实例: awk ‘ { print $1, $2}‘ docs.txt

    -- 关系模式:
      --例子:  awk ‘NF ==3 { print $1, $2}‘ docs.txt
        -- 说明:显示,文件docs.txt中当前行号等于3的行的第一列和第二列;
      ~:   awk ‘$1~/[[:digit:]]+/ {print }‘ docs.txt
        -- 说明:显示,文件docs.txt中“第一列包含至少一个数字”的行;
      !~:  awk ‘$1!~/[[:digit:]]+/ {print NR,$0}‘ docs.txt
        -- 说明:显示,文件docs.txt中“第一列不含有数字”的行的行号和整行内容;

    -- 正则模式:
      --: awk ‘/[[:alpha:]]+/ { print }‘ docs.txt
        -- 说明:显示,文件docs.txt中含有一个或多个字母的行;
      --: awk ‘/ \/bin\/ / { print }‘ docs.txt 对"/"转义处理
        -- 说明:显示,文件docs.txt中包含字符串“/bin/”的行;
      --: awk ‘/ \\zhao / {print }‘ docs.txt 对"\"转义处理
        -- 说明:显示,文件docs.txt中包含字符串“\zhao”的行;

    -- 行范围模式:
      --: awk ‘/88/,/li/ { print }‘ docs.txt
        -- 说明:文件docs中从“包含88的行”到“包含li的行”之间,显示这个区间的所有的行;

9、awk -- Action

综合:
  -- {} 包含多条语句时候,用分号";"分隔。

a、action的理解:


  举例1: awk ‘{ print $0 }‘ docs.txt
  -- 说明:
    -- 上面的语句包含两个动作: “ { } ” 和 “ print $0 ”;
    -- “ { } ” 为 “ 组合语句 ”类型的动作;
    -- “ print $0 ” 为 “输出语句”类型的动作;

  举例2:awk ‘{print $1} {print $2}‘ docs.txt
  -- 说明:
    -- 每行的第一列输出完毕后,然后输出每行的第二列;
    -- 举例2语句 等于 awk ‘{ print $1; print $2 }‘ docs.txt

b、控制语句 之 条件(if、if...else... 、嵌套):

综合:
  -- 说明:在“action(‘program‘ = ‘ Pattern {Action}‘)”内,
      满足条件的行,则执行“动作”(与Pattern 很像,只是“条件”在“动作”之内)。
  -- 复合条件:
    -- and :
      awk ‘{ if( condition1 && condition2 ){ print}}‘ docs.txt
        -- 实例: awk ‘{ if( NR >= 2 && NR<=4){ print NR, $0}}‘ docs.txt
    -- or :
      awk ‘{ if( condition1 || condition2 ){ print}}‘ docs.txt
      -- 实例: awk ‘{ if( NR==3 || NR==4){ print NR, $0}}‘ docs.txt
    -- not :
      awk ‘{ if( !(condition) ){ action } }‘ docs.txt

实例:
  -- if: awk ‘{ if( NR == 3 ){ print $0;print $0} }‘ docs.txt
    -- 说明: 显示,docs中“行号等于3”的整行内容,然后再显示“行号等于3”的整行内容;
  -- if...else...:awk ‘{ if(NR==3){ print NR, $0}else{print NR,"-- empty --"} }‘ docs.txt
    -- 说明:显示,文件docs.txt中 “行号等于3”,显示行号和整行内容;“行号不等于3”,显示行号和"--empyt --" ;
  -- if...else if...else... 嵌套(相当于swich):
    awk ‘{ if(NR==3){ print NR, $0}else if(NR==4){ print NR, $0}else{print NR,"NR != 3 and NR != 4 "} }‘ docs.txt

c、控制语句 之 循环 (for, while, do...while...)

  语法:
    -- for:
      -- for(条件初始化; 循环条件; 循环){ action1; action2;... }
      -- for( 变量 in 数组){ action1; action2;... }
    -- while:
      -- while(循环条件){ action1; action2;... }
      -- do { action } while(循环条件)

  实例:
    -- for:
      -- awk ‘{ for(i=1;i<=5;i++){ print NR, i} }‘ docs.txt
    -- while:
      -- ++i:awk -v i=1 ‘{ while(i<=5){ i++; print NR, i} }‘ docs.txt
      -- i++:awk -v i=1 ‘{ while(i<=5){ print NR, i; i++} }‘ docs.txt
    -- do...while():awk -v i=1 ‘{ do{ print NR,i; i++}while(i<=5)}‘ docs.txt

d、特殊"动作"(break/continue/exit/next/)

  -- 循环控制“动作”:
    -- break:结束循环语句;
      -- 实例:awk ‘BEGIN{for(i=1;i<5;i++){ print "i=", i; break} }‘ docs.txt
    -- continue:结束‘本次’循环,执行‘下次’循环;
      -- 实例:awk ‘BEGIN{for(i=1;i<5;i++){ print "i=", i; continue} }‘ docs.txt

    -- exit :退出当前执行的"program";执行“END模式的动作”;
        如果没有“END模式”,直接退出awk命令。
      -- 实例: awk ‘{ print $0; exit; print NR} END{ print "warning:EXIT"}‘ docs.txt
    -- next :忽略对文件当前行的处理;直接处理文件的下一行
      -- 实例: ‘$1 ~ /[[:digit:]]+/{ next} {print NR, $0}‘ docs.txt

10、awk -- 数组

综合:

  -- 数组的定义:相当于同时声明多个带有下标的变量,变量间用分号";"分隔;
    -- 实例:awk ‘{ name[1]="dog"; name[2]="cat"; name[3]="goose"} { idx=""; for(idx in name){print NR, name[idx]} }‘ docs.txt

  -- index 是保留关键字,不能做自定义变量的名字;

  -- awk 数组的默认下表,从1开始;

  -- awk 数组元素值="",表示此元素值为“空”,隐藏“数组的此元素”;

  -- awk 数组元素值="空格",表示此元素数值为“空格”,“空格”不为“空”;

  -- 判断数组中是否存在对应的元素:"if( 数组下标 in 数组名)";执行“END模式的动作”;

  -- awk 数组的“下标”可以是“数字”,也可以是“任意的字符串”;

  -- awk 数组的本质是“关联数组”;awk默认会把“数字”下标转化为“字符串”,
    所以,本质上“awk的数组” 还是一个使用字符串作为下标的关联数组;

-- delete
  -- 删除数组元素:" delete 数组名[下标] ";
  -- 删除数组:"delete 数组名";

-- 数组遍历:
  -- 数组下标为数字:
    -- for(变量初始化; 条件; 自增自减){ // 数组名[变量]}
  -- 数组下标为字符串:
    -- for(变量 in 数组名){ // 数组名[变量] }

特殊案例:

  -- 字符串统计(这里是重点,超级难理解):

  -- 原理 :
  -- 核心思想:“字符串”可以进行数学加一运算(varname += 1),
        即“相同变量名的字符串”可以累加,“字符串的值”是“此字符串出现的次数”;

  -- awk ‘BEGIN{ var1="china"; print var1; var1 += 1; print var1}‘ docs.txt

  -- 在数学计算中,字符串变量当作数字“0”参与数值计算;

  -- 方法:对于一个不存在的元素,进行自加运算后,这个元素的值变成了自家运算的次数。

  -- 统计“所有字段出现的次数”:
    -- awk ‘{ count[$1]++ } END{ for(i in count){ print count[i], i}}‘ docs.txt

11、awk -- 内置函数

综合:

  -- 数学函数:rand()-随机函数, srand()-随机函数 / int()-截取整数部分;

  -- 字符处理函数:
    -- 替换函数:
      gsub(源字符, 目标字符, 字段):范围内的所有‘l‘都替换为‘m‘,
      sub(源字符, 目标字符, 字段):替换范围内的第一个字符‘l‘替换为‘m‘;
        -- 举例1: gsub(l, m, $1);
        -- 举例2: sub(l, m, $1);

  -- length(字段):输出每行的所有列分别含有多少个字符;
    -- 举例: awk ‘{ length($1) }‘ docs.txt ;

  -- index(字段, 查询的字符串):获取“指定字符串” 在 “整行 ”的第几个字符开始;
    -- 举例: awk ‘{ index($1, "lee")}‘

  

  -- 其他函数:
    -- asort(原数组, 新数组):将“原数组”排序,排序后的结果放入“新数组”;
      --举例: awk ‘BEGIN{ t["z"]=66; t["a"]=3; t["q"]=88; asort(t, newarray); for(i in newarray){ print i, newarray[i]} }‘ docs.txt

12、awk -- 补充

-- 三元运算符:(exp1) ? exp2 : exp3 == if ( exp1){ exp2} else { exp3}

 

-- 奇数行打印/偶数行打印:
  -- 奇数行打印:‘ i = !i‘
    -- awk ‘i = !i{ print NR, $0}‘ docs.txt;
-- 偶数行打印:‘ !(i = !i)‘
    -- awk ‘!(i = !i){ print NR, $0}‘ ldocs.txt;

原文地址:https://www.cnblogs.com/lnlidawei/p/12375388.html

时间: 2024-11-13 09:57:24

awk 总结的相关文章

新awk整理

总感觉上一篇awk的总结几乎是照着man翻译过来的,惨不忍睹 无意间在互联网上有找到了宝贵的资料 感觉整理的很好,想着照着这个来重新写下,对照新的man更新下吧,只是总是在改变的 一.awk简介二.awk工作流程三.awk程序结构四.awk基本语法 awk命令行模式 awk程序文件 awk标准选项五.awk内置变量 标准awk变量 awk特定变量(即专有变量)六.awk操作符 算数运算符 关系运算符 逻辑运算符 三元运算符 一元运算符 字符串连接操作符(即空格符) 数组成员操作符(in) 正则表

linux提取指定列字符并打印所有内容(awk)

假设有文件长如下样子: CHROM  POS     ID      REF     ALT     QUAL    FILTER  INFO    FORMAT  samplename 1 3552841 . G . 32.995 . DP=1;MQ0F=0;AF1=0;AC1=0;DP4=1,0,0,0;MQ=40;FQ=-29.9912 GT:PL:DP 0/0:0:1 1 3552842 . T . 32.995 . DP=1;MQ0F=0;AF1=0;AC1=0;DP4=1,0,0,0

shell之awk

简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行读入,以空格为默认分割符将每行切片,切开的部分再进行各种分析处理. 使用方法: awk [option] 'pattern1{action1}pattern2{action2}' {filenames} 尽管操作可能会很复杂,但语法总是这样,其中pattern表示awk在数据中查找的内容,而action是在找到匹配内容时所执行的一系列命令. awk

awk中使用shell变量

其实在awk里,是不能直接使用shell变量的 方法是:awk -v 选项让awk 里使用shell变量 TIME=60 awk -v time="$TIME" 'BEGIN{FS="|"} {if ($7>time) print $2 }' 这样要注意:在awk里,time不能加$符号. 网上说如下方法都可行: 一:"'$var'" 这种写法大家无需改变用'括起awk程序的习惯,是老外常用的写法.如: var="test&quo

awk 字符串处理函数

awk提供了许多强大的字符串函数,见下表:awk内置字符串函数gsub(r,s)    在整个$0中用s替代rgsub(r,s,t)    在整个t中用s替代rindex(s,t)    返回s中字符串t的第一位置length(s)    返回s长度match(s,r)    测试s是否包含匹配r的字符串split(s,a,fs)    在fs上将s分成序列asprint(fmt,exp)    返回经fmt格式化后的expsub(r,s)    用$0中最左边最长的子串代替ssubstr(s,

awk

cat 1.txt 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 行转列: awk '{for(i=1;i<=NF;i++)printf("%s\n",$i)};{printf "\n"}' 1.txt 显示如下: 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9

如何在linux Shell脚本里面把一个数组传递到awk内部进行处理

前段时间和几位同事讨论过一个问题:Shell脚本里面怎样把一个数组传递到awk内部进行处理? 当时没有找到方法.前两天在QQ群里讨论awk的时候,无意间又聊起这个话题.机缘巧合之下找到一个思路,特此分享. 测试环境: [root]# head -1 /etc/redhat-release Red Hat Enterprise Linux Server release 6.5 (Santiago) [root]# awk --version | head -1 GNU Awk 3.1.7 众所周知

Linux文本处理三剑客之GNU awk的使用

awk: Aho, Weinberger, Kernighan,报告生成器,格式化文本输出 有多种版本:New awk(nawk),GNU awk(gawk) gawk –模式扫描和处理语言 基本用法: awk[options] 'program' var=value file- awk[options] -f programfile var=value file- awk[options] 'BEGIN{ action;... } pattern{ action;... } END{ acti

第4章 awk编程

1 awk编程模型       2 awk用法 调用awk有三种方法(与sed类似): 在Shell命令行输入命令调用awk,格式为: awk [-F 域分隔符] 'awk程序段' 输入文件 将awk程序段插入脚本文件后,然后通过awk命令调用它: awk -f awk脚本文件输入文件 将awk命令插入脚本文件后,最常用的方法是设置该脚本文件为可执行,然后直接执行该脚本文件,格式为: ./awk脚本文件输入文件 注:第二种方法脚本文件的首行不以#!/bin/awk –f开头:第三种方法脚本文件的

awk: (FILENAME=- FNR=1) 致命错误: 试图访问字段 -2

执行:awk '{print $(NF-2)}' aa.log 出现错误:awk: (FILENAME=aa.log FNR=1) 致命错误: 试图访问字段 -2 可能和aa.log中数据有关系: 改为: awk 'NF>1{print $(NF-2)}' aa.log