sed与awk基本知识

本文详细介绍了sed和awk的基本知识,包括ed编辑器的使用、命令行语法、脚本化处理、常见应用等。重点展示了如何在文本处理中使用sed去除^M符号、在文件末尾插入文本,以及awk的常用命令如打印指定行、匹配模式等。通过实例代码,深入浅出地阐述了sed与awk在实际应用中的实用技巧。
<?xml version="1.0" encoding="utf-8"?> 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

转载于:https://www.cnblogs.com/liweilijie/archive/2013/01/01/2841439.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值