zoukankan      html  css  js  c++  java
  • sed&awk

    我的理解,sed是匹配&替换,awk是匹配&过滤。这匹配的意思就是模式串的匹配,这替换就是堆匹配到的串进行替换操作,这过滤就是筛选出指定的字段出来。

    手册把sed称为stream editor,即流编辑器,重点是流。而awk则被称为pattern scanning and text processing language,即模式搜索与文本处理的语言,记住它是门语言。

    awk

    awk命令模式:

    awk 'pattern { action }' input
    

    pattern字段是可选的,用于执行逻辑判断。action字段必要的,用于操作,支持的内容就多了,可以打印,根据参数作运算等等。默认是根据空格或 来分列的。

    测试输入样本:

    Beth	4.00	0
    Dan	3.75	0
    kathy	4.00	10
    Mark	5.00	20
    Mary	5.50	22
    Susie	4.25	18
    

    打印首列:

    awk '{print $1}'  input
    

    支持数字(整型、浮点型之间相互)比较:

    awk '$3 <= 0 {print $1}'  input
    

    支持字符串比较:

    awk '$1 == "Mary" {print $1}'  input
    

    支持||&&:

    awk '$3 <= 0 || $3 >= 22 {print $1}'  input
    awk '!($3 >= 0 && $3 < 22) {print $1}'  input
    

    pattern字段支持运算:

    awk '$3 * $3 > 9 {print $1}'  input
    

    以两个/括起来的pattern支持正则:

    awk '/Ma.k/ {print $1}'  input
    

    支持逻辑取反符号:

    awk '!/Ma.k/ {print $1}'  input
    

    支持多个输入文件:

    awk '{print $1}'  input1 input2
    

    支持从文件读取命令:

    awk  -f executefile  input
    

    打印整行:

    awk '{print $0}'  input
    awk '{print}'  input
    

    不清楚有多少列,打印最后一列:

    awk '{print $NF}'  input
    

    打印列数:

    awk '{print NF}'  input
    

    支持计算:

    awk '{print  $2 * $2 * $3}'  input
    

    ,号会被输出成空格,打印多列需用,分隔:

    awk '{print  $2,$3}'  input
    

    打印行号:

    awk '{print  NR}'  input
    

    插入常量字符串:

    awk { print "total pay for", $1, "is", $2 * $3 } input
    

    使用printf进行格式化输出:

    awk '{ printf("total pay for %s is %.2f
    ", $1, $2 * $3) }'  input
    

    改变分隔符(-F须放在前面):

    awk -F ">"   '{print  $3}'  input
    awk -F ","   '{print  $3}'  input
    

    支持以[]:隔开多个分隔符(不能有空格,顺序无关):

    awk -F [",":"|"] '{print $3}' input
    

    对某一列进行累加

    awk '{sum += $2}END{print sum/107}'  input
    

    sed

    sed命令模式

    sed  'pattern'  input
    

    这个pattern没有很直观,都是以指令驱动的,指令可以在前面(如s),也可以在末尾(如p)。常见的需求就是增/删/查/改,就是在匹配行的前/后n行插入新行,就是删除匹配的行,其实可以用grep替代,就是找出匹配的行进行修改(有上下文关系的,比如匹配多行就比较麻烦了)。

    先来了解如何指定输入的行号。

    打印文件内容

    sed -n 'p'  input
    

    打印文件行号(行号是新起一行的)

    sed -n '=;p'  input
    

    只打印第2行

    sed -n '2p'  input
    

    打印2~4行

    sed -n '2,4p'  input
    

    从第4行开始输出到结束

    sed -n '2,$p'  input
    

    打印2~4行且打印行号

    sed -n '2,4{=;p}'  input
    

    打印含有abc的行

    sed -n '/abc/p'  input
    

    打印1~4行中含有Mem的行

    sed -n '/Mem/,{1,4p}'  input
    

    打印除了1~4行的内容

    sed -n '1,4!p'  input
    

    打印匹配Mem至匹配Swap的行
    ···
    sed -n '/Mem/,/Swap/p' input
    ···

    简单全局替换(不修改源文件,直接输出到终端)

    sed 's/str1/str2/g' input
    

    全局替换(修改源文件)

    sed -i 's/str1/str2/g' input
    

    指定其他分隔符,可避免频繁输出转义符号(下例把/替换成|)

    sed -i 's:/:|:g' input
    

    从指定文件中执行命令

    sed  -f cmd  input
    

    只输出匹配的行(-n搭配p,默认是全输出)

    sed -n '$p' input
    

    优质文章:http://blog.jobbole.com/109088/#toc_1

  • 相关阅读:
    oracle语法
    cin.clear()、cin.sync()
    Intellij Idea Spring Boot 热部署
    navicat_premium_x64最新版安装说明
    激活navicat premium12
    时间戳Unix和时间之间的转换
    排序算法-- 大总结
    The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
    final
    static
  • 原文地址:https://www.cnblogs.com/xcw0754/p/10046413.html
Copyright © 2011-2022 走看看