zoukankan      html  css  js  c++  java
  • sed与awk基本知识<1>

    sed与awk基本知识<1>

    sed与awk基本知识<1>

    1 sed awk 基础知识

    awk 起源于 sedgrep , 而不是ed

    但是ed很古老也很经典.这里特意地学习一下 ed 编辑器.

    1.1 ed

    1. ed 的替换命令是 s :
      
          #!/bin/bash
          #TODO(1): [address]s/pattern/replacement/flag
          #pattern是一个正则表达式
          #为了寻找同一行上的多次出现,必须指定 g 作为标志
          s/regular/complex/g
      
          #TODO(2):上面的命令只能在当前行上操作.而如果要在其他地方操作,则必须指定一个地址.
          /regular/s/regular/complex/g
          #记住:第一个"regular"是一个地址,第二个是匹配替换命令的模式.
          #TODO(3): 要将它使用于全局命令,即在地址前放置:g
          g/regular/s/regular/complex/g
      
          #TODO(3): 地址和模式不必相同:
          g/regular expression/s/regular/complex/g
          #表示在包含字符串"regular expression"的任意行上,用"complex"代替"regular".
          #如果地址与模式相同,可以指定两个连接的定界符(//)来告诉ed
          g/regular/s//complex/g
      
      
          
    2. sed与ed的区别:
      • sed面向流,而ed是一个编辑器.
      • sed命令是隐式的全局命令,因为它的每一条命令都应该一个流的一行.而ed默认是单行命令.

    1.2 命令行的语法

    可以大致相同的方式调用sed和awk,命令行语法是: command [options] script filename

    另外还有一个共同的处理脚本命令: sed -f scriptfile inputfile

    1.3 脚本化

    在sed和awk中,每个指令都包括两个部分:模式和过程.

    模式是由斜杠(/)分隔的正则表达式,过程指定一个或多个将被执行的动作.


    1.4 使用sed

    sed [-e] 'instruction' file

    只有在命令行上给出多个指令时才需要用 -e 选项,它告诉sed将下一个参数解释为指令,当只有一个指令时,sed可以自己做决定.

    
    #!/bin/bash
    # TODO(1): 加上单引号是个很好习惯
    sed 's/MA/Massachusetts/' list
    sed 's/ MA/, Massachusetts/' list
    
    #有三种方式可以指定命令行上的多重指令:
    #TODO(2.1):用分号分隔指令:
    sed 's/ MA/,Massachusets/;s/ PA/, Pennsylvania/' list
    
    #TODO(2.2):在每个指令前放置 -e
    sed -e 's/ MA/, Massachusetts/' -e 's/ PA/, Pennsylvania/' list
    
    #TODO(2.3):脚本方式
    
    
    

    1.4.1 脚本文件

    
    #!/bin/bash
    #查看一下脚本内容
    cat sedsrc
    s/ MA/, Massachusetts/
    s/ PA/, Pennsylvaniz/
    s/ CA/, California/
    s/ VA/, Virginia/
    
    #运行脚本命令
    sed -f sedsrc list
    
    

    1.4.2 保存输出

    
    #!/bin/bash
    sed -f sedsrc list > newlist
    
    

    1.4.3 防止输入行的自动显示

    sed的默认操作是输出每个输入行, -n 选项可以阻止自动输出,当指定该选项时,每个要生成输出的指令都必须包含打印命令 p .

    
    #!/bin/bash
    sed -n -e 's/MA/Massachusetts/p' list
    
    

    1.5 使用awk

    awk 'instructions' files

    awk -f script files

    awk可以用与sed相同方式的输入多重命令行:用分号分隔命令.

    
    #!/bin/bash
    #$0:代表整个输入行;
    #$1,$2....表示输入行上的各个字段,应用脚本之前,awk先拆分输入记录
    
    #TODO(1): 这个命令没有指定模式,所以打印语句应用于所有行
    awk '{print $1}' list
    
    #TODO(2): 这个命令没有过程,这个默认操作是打印匹配这种模式的每一行:
    awk '/MA/' list
    
    #TODO(3): 下面这条命令只输入匹配到的每条记录的第一个字段
    awk '/MA/ {print $1}' list
    
    #TODO(4): 用 -F 选项来改变分隔符
    awk -F, '/MA/ {print $1}' list
    
    #TODO(5): 将每一个字段单独打印在每一行上,多重命令由分号来分隔:
    awk -F, '{print $1; print $2; print $3}' list
    
    
    

    1.6 同时使用sed与awk

    
    #!/bin/bash
    sed -f nameState list | awk -F, '{print $4}'
    
    sed -f nameState list | awk -F, '{print $4 ", " $0}'
    
    

    2 平时常用

    2.1 去掉 ^M

    为什么去掉它,因为有的同事在windows下开发代码,跟我合并代码时就会存在这种问题,于是用一条sed命令即可搞定.

    
       #!/bin/bash
       sed -i -e 's/^M//g' *.[ch]
    
       

    Type the following command (to get ^M type CTRL+V followed by CTRL+M):

    
        #!/bin/bash
        sed -e '/^M/d' input
        sed -e '/^M/d' input > output
        # gnu sed
        sed -i -e '/^M/d' input
    
        #The substitute command can be used as follows too:
    
        sed -e 's/^M//g' input
        sed -e 's/^M//g' input > output
        # gnu sed
        sed -i -e 's/^M//g' input
        # replace line feed with FOO
        sed -i -e 's/^M/FOO/g' input
    
        #tested with GNU sed
        sed -e '/^M/d' -i -r $(find . -type f)
    
        

    2.2 在文件的最后插入一行

    
        #!/bin/bash
    
        # 直接重定向到最后一行
        echo "内容" >> file
    
        # 利用a命令插入到最后一行
        sed -i '$a 内容' >> file
    
        # 利用i命令插入到最后一行的前一行
        sed -i '$i 内容' >> file 
    
        

    Date: 2013-01-01 Tue

    Author: liweilijie

    Org version 7.9.2 with Emacs version 23

    Validate XHTML 1.0
  • 相关阅读:
    【转】Scala基础知识
    Python知识之 方法与函数、偏函数、轮询和长轮询、流量削峰、乐观锁与悲观锁
    jQuery Ajax async=>false异步改为同步时,导致浏览器假死的处理方法
    Django框架之DRF APIView Serializer
    Python之虚拟环境virtualenv、pipreqs生成项目依赖第三方包
    celery 分布式异步任务框架(celery简单使用、celery多任务结构、celery定时任务、celery计划任务、celery在Django项目中使用Python脚本调用Django环境)
    微信推送功能实现
    Haystack搜索框架
    支付宝支付
    Redis初识01 (简介、安装、使用)
  • 原文地址:https://www.cnblogs.com/liweilijie/p/2841439.html
Copyright © 2011-2022 走看看