zoukankan      html  css  js  c++  java
  • 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
    #include <stdio.h>
    int main()
    {
    	printf("This is Main()!
    ");
    	return 0;
    }

          删除第2行,并用 return 1; 取代第6行
    windeal@ubuntu:~/Windeal/Test$ sed -e '2d' -e '6c \treturn 1;' test.c
    #include <stdio.h>
    int main()
    {
    	printf("This is Main()!
    ");
    	return 1;
    }
    windeal@ubuntu:~/Windeal/Test$ 


        在动作脚本中    \t是为了在return前面插入tab,需要两个转义字符
        使用-f脚本选项,在第6行前面插入printf("Hello! ");  并将第5行的Main替换为MyMain
            
    windeal@ubuntu:~/Windeal/Test$ sed -f script test.c 
    #include <stdio.h>
    int main()
    {
    	printf("This is MyMain()!
    ");
    	printf("hello!
    ");
    	return 0;
    }
    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
    No.	Name	Chinese	Math
    001	Jack	80	85
    002	Jane	90	90
    003	Ben	85	90
    004	Alice	85	95
            1. 输出行号,第1个字段、第3个字段、第4个字段
    windeal@ubuntu:~/Windeal/Test$ awk '{print "line:" NR "	" $1 "	" $3 "	" $4}' stu.txt
    line:1	No.	Chinese	Math
    line:2	001	80	85
    line:3	002	90	90
    line:4	003	85	90
    line:5	004	85	95
    windeal@ubuntu:~/Windeal/Test$

        注意所有文本要使用双引号
    2.输出数学考90的同学
    windeal@ubuntu:~/Windeal/Test$  awk 'NR==1 {print} NR>1&&$4==90{print}' stu.txt 
    No.	Name	Chinese	Math
    002	Jane	90	90
    003	Ben	85	90
    windeal@ubuntu:~/Windeal/Test$ 



             3 支持格式化输出和if语句
    windeal@ubuntu:~/Windeal/Test$ awk '{if(NR==1) printf "%10s %10s %10s %10s %10s
    ",$1,$2,$3,$4,"Sum"}
     NR>=2{Sum=$3+$4 
    printf "%10s %10s %10s %10s %10s
    ",$1,$2,$3,$4,Sum}' stu.txt
           No.       Name    Chinese       Math        Sum
           001       Jack         80         85        165
           002       Jane         90         90        180
           003        Ben         85         90        175
           004      Alice         85         95        180
    windeal@ubuntu:~/Windeal/Test$ 

    Sum=$3+$4 后面需要换行,还不清楚为什么。
  • 相关阅读:
    UVa10340.All in All
    UVa1368.DNA Consensus String
    《Algorithms 4th Edition》读书笔记——3.1 符号表(Elementary Symbol Tables)-Ⅲ
    UVa232.Crossword Answers
    Uva272.TEX Quotes
    《Algorithms 4th Edition》读书笔记——3.1 符号表(Elementary Symbol Tables)-Ⅱ
    算法面试(3)
    算法面试(2)
    算法面试(1)
    hdu 4896 Minimal Spanning Tree
  • 原文地址:https://www.cnblogs.com/Windeal/p/4284671.html
Copyright © 2011-2022 走看看