首页 > 代码库 > sed和awk简介

sed和awk简介

什么是sed和awk

        sed和awk是Linux环境下数据的处理工具,可以完成对数据的增删改查的功能。
        sed处理时是以行尾单位的,awk处理数据时以字段为单位。

sed

        用法:sed  【选项】 【动作】 【文件】 
        以行为处理单位
    选项:
        -n:安静模式,仅显示被处理的行,如果改行是被删除的,则不显示
        -e:add the script to the commands to be executed(用于连接多个动作脚本)
        -r:表示命令使用的动作时延伸型的正则表达式
        -i:直接在文件上进行编辑,而不是输出到屏幕上
        -f:使用脚本文件,即动作编辑在脚本文件中,支持一个脚本文件中使用多个动作
    动作:[n1[,n2]]function
        [n1[,n2]]不一定有,function如下:
        c:行取代,用新行(字符串)替换旧行
        d:删除行
        i: 在当前行前面插入一行数据(字符串)
        p:打印行
        s:s/regexp/replacement/  用新字符串替换旧字符串。s后面接分隔符,默认为/
    练习:
        测试文件:test.c
  1. #include <stdio.h>
  2. int main()
  3. {
  4. printf("This is Main()!\n");
  5. return 0;
  6. }
      删除第2行,并用 return 1; 取代第6行
  1. windeal@ubuntu:~/Windeal/Test$ sed -e ‘2d‘ -e ‘6c \\treturn 1;‘ test.c
  2. #include <stdio.h>
  3. int main()
  4. {
  5. printf("This is Main()!\n");
  6. return 1;
  7. }
  8. windeal@ubuntu:~/Windeal/Test$
    在动作脚本中    \\t是为了在return前面插入tab,需要两个转义字符
    使用-f脚本选项,在第6行前面插入printf("Hello!\n");  并将第5行的Main替换为MyMain
        
  1. windeal@ubuntu:~/Windeal/Test$ sed -f script test.c
  2. #include <stdio.h>
  3. int main()
  4. {
  5. printf("This is MyMain()!\n");
  6. printf("hello!\n");
  7. return 0;
  8. }
  9. windeal@ubuntu:~/Windeal/Test$

awk

    用法:
         1      mawk  [-W  option]  [-F value] [-v var=value] [--] ‘program text‘ [file ...]
         2    mawk [-W option] [-F value] [-v var=value] [-f program-file] [--] [file ...]
         用法1和2的区别在于是直接使用脚本命令还是有脚本文件,即脚本是直接使用还是写在一个文件里
    选项
        -W 表示一些特殊选项(还没怎么用到过)
        -F 表示分隔符
        -v 定义变量,或给变量赋值
        -f  使用脚本
    特殊变量
        NF    每行的字段数
        NR    当前处理行
        FS    分隔符
    脚本形式:
        An  AWK  program  is  a sequence of pattern {action} pairs and function  definitions.
        即又[条件][动作] [条件][动作]...组成
        [条件]支持逻辑运算符 < > = >= <= ==
        支持格式化输出和if语句
    练习:
        测试数据    stu.txt
  1. No. Name Chinese Math
  2. 001 Jack 80 85
  3. 002 Jane 90 90
  4. 003 Ben 85 90
  5. 004 Alice 85 95

        1. 输出行号,第1个字段、第3个字段、第4个字段
    
  1. windeal@ubuntu:~/Windeal/Test$ awk ‘{print "line:" NR "\t" $1 "\t" $3 "\t" $4}‘ stu.txt
  2. line:1 No. Chinese Math
  3. line:2 001 80 85
  4. line:3 002 90 90
  5. line:4 003 85 90
  6. line:5 004 85 95
  7. windeal@ubuntu:~/Windeal/Test$
            注意所有文本要使用双引号
        2.输出数学考90的同学
  1. windeal@ubuntu:~/Windeal/Test$ awk ‘NR==1 {print} NR>1&&$4==90{print}‘ stu.txt
  2. No. Name Chinese Math
  3. 002 Jane 90 90
  4. 003 Ben 85 90
  5. windeal@ubuntu:~/Windeal/Test$

         3 支持格式化输出和if语句
  1. windeal@ubuntu:~/Windeal/Test$ awk ‘{if(NR==1) printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Sum"}\
  2. NR>=2{Sum=$3+$4
  3. printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,Sum} stu.txt
  4. No. Name Chinese Math Sum
  5. 001 Jack 80 85 165
  6. 002 Jane 90 90 180
  7. 003 Ben 85 90 175
  8. 004 Alice 85 95 180
  9. windeal@ubuntu:~/Windeal/Test$
Sum=$3+$4 后面需要换行,还不清楚为什么。