sed:  s----substitute(替换)

1. 文本替换(使用-i选项,可以将结果应用于原文件)

many people在进行替换之后,借助重定向来保存文件(未使用-i选项):

$ sed  's/text/replace_text/' file > newfile

$ mv newfile file

landen@landen-Lenovo:~/文档$ cat apacheLog.txt
125.226.150.44 – - [21/Jul/2012:01:12:56 +0800] "GET /tom1.dat HTTP/1.1" 200 8092 "-" "Mozilla/4.0 (compatible; MSIE 8.00; Windows 7)"
125.226.151.42 – - [21/Jul/2012:01:15:56 +0800] "GET /tom2.dat HTTP/1.1" 200 8092 "-" "Mozilla/4.0 (compatible; MSIE 7.00; Windows 7)"

landen@landen-Lenovo:~/文档$ sed -i 's/tom/sam/' apacheLog.txt
landen@landen-Lenovo:~/文档$ cat apacheLog.txt
125.226.150.44 – - [21/Jul/2012:01:12:56 +0800] "GET /sam1.dat HTTP/1.1" 200 8092 "-" "Mozilla/4.0 (compatible; MSIE 8.00; Windows 7)"
125.226.151.42 – - [21/Jul/2012:01:15:56 +0800] "GET /sam2.dat HTTP/1.1" 200 8092 "-" "Mozilla/4.0 (compatible; MSIE 7.00; Windows 7)"

landen@landen-Lenovo:~/文档$ sed -i 's/sam[[:digit:]].dat/tom.txt/' apacheLog.txt
landen@landen-Lenovo:~/文档$ cat apacheLog.txt
125.226.150.44 – - [21/Jul/2012:01:12:56 +0800] "GET /tom.txt HTTP/1.1" 200 8092 "-" "Mozilla/4.0 (compatible; MSIE 8.00; Windows 7)"
125.226.151.42 – - [21/Jul/2012:01:15:56 +0800] "GET /tom.txt HTTP/1.1" 200 8092 "-" "Mozilla/4.0 (compatible; MSIE 7.00; Windows 7)"

上面的sed命令只是将每一行中第一处符合样式的内容替换掉。But如果要替换所有内容,so需要在命令尾部加上参数g. 其方法如下:

landen@landen-Lenovo:~/文档$ cat apacheLog.txt | sed -i 's/sam.dat/tom.arff/' apacheLog.txt
landen@landen-Lenovo:~/文档$ cat apacheLog.txt
125.226.150.44 – - [21/Jul/2012:01:12:56 +0800] "GET /tom.arff sam.dat HTTP/1.1" 200 8092 "-" "Mozilla/4.0 (compatible; MSIE 8.00; Windows 7)"
125.226.151.42 – - [21/Jul/2012:01:15:56 +0800] "GET /tom.arff sam.dat HTTP/1.1" 200 8092 "-" "Mozilla/4.0 (compatible; MSIE 7.00; Windows 7)"

landen@landen-Lenovo:~/文档$ cat apacheLog.txt | sed -i 's/tom.txt/sam.dat/g' apacheLog.txt
landen@landen-Lenovo:~/文档$ cat apacheLog.txt
125.226.150.44 – - [21/Jul/2012:01:12:56 +0800] "GET /sam.dat sam.dat HTTP/1.1" 200 8092 "-" "Mozilla/4.0 (compatible; MSIE 8.00; Windows 7)"
125.226.151.42 – - [21/Jul/2012:01:15:56 +0800] "GET /sam.dat sam.dat HTTP/1.1" 200 8092 "-" "Mozilla/4.0 (compatible; MSIE 7.00; Windows 7)"

But Sometimes不需要替换前N处匹配,而是需要替换剩下的匹配。有一个选项可以用来忽略前N处匹配,并从第N+1处开始替换,即 /Ng,如下:

landen@landen-Lenovo:~/文档$ cat apacheLog.txt | sed -i 's/tom.arff/sam.dat/2g' apacheLog.txt
landen@landen-Lenovo:~/文档$ cat apacheLog.txt
125.226.150.44 – - [21/Jul/2012:01:12:56 +0800] "GET /tom.arff sam.dat HTTP/1.1" 200 8092 "-" "Mozilla/4.0 (compatible; MSIE 8.00; Windows 7)"
125.226.151.42 – - [21/Jul/2012:01:15:56 +0800] "GET /tom.arff sam.dat HTTP/1.1" 200 8092 "-" "Mozilla/4.0 (compatible; MSIE 7.00; Windows 7)"

2. 移除空白行 (d----delete(移除))

apachelog.txt文件内容如下(两行间有空行):

125.226.150.44 – - [21/Jul/2012:01:12:56 +0800] "GET /tom.arff sam.dat HTTP/1.1" 200 8092 "-" "Mozilla/4.0 (compatible; MSIE 8.00; Windows 7)"

125.226.151.42 – - [21/Jul/2012:01:15:56 +0800] "GET /tom.arff sam.dat HTTP/1.1" 200 8092 "-" "Mozilla/4.0 (compatible; MSIE 7.00; Windows 7)"

landen@landen-Lenovo:~/文档$ sed '/^$/d' apacheLog.txt (未使用-i选项,即未应用于原文件)
125.226.150.44 – - [21/Jul/2012:01:12:56 +0800] "GET /tom.arff sam.dat HTTP/1.1" 200 8092 "-" "Mozilla/4.0 (compatible; MSIE 8.00; Windows 7)"
125.226.151.42 – - [21/Jul/2012:01:15:56 +0800] "GET /tom.arff sam.dat HTTP/1.1" 200 8092 "-" "Mozilla/4.0 (compatible; MSIE 7.00; Windows 7)"

3. 已匹配字符串标记&

在sed中,用&标记匹配样式的字符串,thus,就能够在替换字符串时use已匹配的内容

landen@landen-Lenovo:~/文档$ sed 's/\w\+/[&]/g' apacheLog.txt (未使用-i选项,即未应用于原文件)

[125].[226].[150].[44] – - [[21]/[Jul]/[2012]:[01]:[12]:[56] +[0800]] "[GET] /[tom].[arff] [sam].[dat] [HTTP]/[1].[1]" [200] [8092] "-" "[Mozilla]/[4].[0] ([compatible]; [MSIE] [8].[00]; [Windows] [7])"

[125].[226].[151].[42] – - [[21]/[Jul]/[2012]:[01]:[15]:[56] +[0800]] "[GET] /[tom].[arff] [sam].[dat] [HTTP]/[1].[1]" [200] [8092] "-" "[Mozilla]/[4].[0] ([compatible]; [MSIE] [7].[00]; [Windows] [7])"

4. 子串匹配标记 \1,\2 (后向引用)

apacheLog.txt原内容如下:

125.226.150.44 – - [21/Jul/2012:01:12:56 +0800] "GET /tom.arff sam.dat HTTP/1.1" 200 8092 "-" "Mozilla/4.0 (compatible; MSIE 8.00; Windows 7)"

125.226.151.42 – - [21/Jul/2012:01:15:56 +0800] "GET /tom.arff sam.dat HTTP/1.1" 200 8092 "-" "Mozilla/4.0 (compatible; MSIE 7.00; Windows 7)"

&代表匹配给定样式的字符串,but我们可以用后向引用 \1,\2 匹配给定样式的其中一部分(括号内),如下:

landen@landen-Lenovo:~/文档$ sed 's/200 \([0-9]\+\)/ "-" "Mozilla/4.0 (compatible; MSIE 8.00; Windows 7)"

125.226.151.42 – - [21/Jul/2012:01:15:56 +0800] "GET /tom.arff sam.dat HTTP/1.1" "-" "Mozilla/4.0 (compatible; MSIE 7.00; Windows 7)"

5. 组合多个表达式

sed 'expression1' | 'expression2' 等价于 sed ' expression1; expression2 '

6. 引用

sed表达式通常用单引号来引用。不过亦可以用双引号,双引号会通过对表达式求值来对其进行扩展。当想在sed表达式中使用一些变量字符串时,双引号就有用武之地了,如下:

landen@landen-Lenovo:~/文档$ text=hello
landen@landen-Lenovo:~/文档$ echo hello world | sed "s/$text/HELLO/"
HELLO world

awk:被设计用于数据流,可对列和行进行操作。In addition, awk有很多内建的功能,such as 数组,函数等

awk脚本的结构基本如下所示:

awk ‘BEGIN{ print "start" } pattern { commands } END{ print "end" }'

从上之,一个awk脚本通常由3部分组成: BEGIN语句块,END语句块和能够使用模式匹配的通用语句块。这3个语句块是可选的,它们中任何一个部分都可以不出现在脚本中。脚本通常会被包含在单引号或双引号中

工作方式如下所示:

1》 执行BEGIN { commands } 语句块中的语句;

2》从文件或stdin中读取一行,然后执行pattern { commands } . 重复这个过程(类似while循环),直到文件全部被读取完毕(默认执行{ print } , 即打印每一个读取到的行。awk对于读取到每一行,都会执行这个语句块);

3》当读至输入流 (input stream) 末尾时,执行END { commands } 语句块

例如:

landen@landen-Lenovo:~/文档$ echo -e "line1\nline2" | awk 'BEGIN{ print "Start" } { print } END{ print "END" }'
Start
line1
line2
END

当使用不带参数的print时,它会打印出当前行。

Note: 1. 当print的参数是以逗号进行分割时,参数打印时则以空格作为定界符

2. 在awk的print语句中,双引号是被当做拼接操作符使用的。

例如:

landen@landen-Lenovo:~/文档$ echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1,var2,var3; }'
v1 v2 v3
landen@landen-Lenovo:~/文档$ echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1"-"var2"-"var3; }'
v1-v2-v3

1. awk中的特殊变量

NR: 表示记录数量(number of records), 在执行过程中对应于当前行号;

NF: 表示字段数量(number of fields), 在执行过程中对应于当前行的字段数;

$0:  这个变量包含执行过程中当前行的文本内容;

$1:  这个变量包含第一个字段的文本内容;

$2:  这个变量包含第二个字段的文本内容。

2. 将外部变量值传递给awk

借助选项-v,可以将外部值(并非来自stdin)传递给awk,例如:

landen@landen-Lenovo:~/文档$ VAR=love

landen@landen-Lenovo:~/文档$ echo | awk -v VARIABLE=$VAR '{ print VARIABLE }'
love
In addition, 有一种灵活的方式可以将多个外部变量传递给awk,给变量赋值时,只能用分号或空格隔开例如:

landen@landen-Lenovo:~/文档$ var1="I"; var2="Love"; var3="You"
landen@landen-Lenovo:~/文档$ echo | awk '{ print v1,v2,v3}' v1=$var1 v2=$var2 v3=$var3
I Love You
landen@landen-Lenovo:~/文档$ vari1="I" vari2="Love" vari3="You"
landen@landen-Lenovo:~/文档$ echo | awk '{ print v1,v2,v3}' v1=$vari1 v2=$vari2 v3=$vari3
I Love You
注意:awk最后的v1,v2,v3之间只能用空白隔开,不能有“ ;,”等其它符号隔开,否则只会获取第一个;左边最近的值,如下:

landen@landen-Lenovo:~/文档$ vari1="I" vari2="Love" vari3="You"
landen@landen-Lenovo:~/文档$ echo | awk '{ print v1,v2,v3}' v1=$vari1;v2=$vari2;v3=$vari3

3. 用getline读取行

landen@landen-Lenovo:~$ echo -e "I\nLove\nYou" | awk 'BEGIN { getline; print "Read ahead first line", $0 } { print $0 }'
Read ahead first line I
Love
You

4. 用样式对awk处理的行进行过滤

$ awk ' NR < 5 ' # 行号小于5的行

$ awk ' NR==1,NR==4 ' # 行号在1到5之间的行

$ awk ' /linux/ ' # 包含样式linux的行(可用正则表达式来指定样式)

$ awk ' !/linux/ ' # 不包含样式linux的行

5. 从awk中读取命令输出

landen@landen-Lenovo:~/文档$ echo | awk '{ "grep o testfile" | getline cmdout ; print cmdout }'

Love

6. 设置字段定界符

-F "delimiter"

7. 在awk中使用循环

Linux之sed,awk(流编辑器)的更多相关文章

  1. Linux下sed,awk,grep,cut,find学习笔记

    awk awk是一种程序语言,对文档资料的处理具有很强的功能.awk擅长从格式化报文或从一个大的文本文件中抽取数据. awk的命令格式为: awk [-F filed-separator] “comm ...

  2. linux grep,sed,awk和diff的使用

    1:grep//显示行 # grep 'main' /home/myhome/a.c//将a.c含有main的行显示出来 # grep -v 'main' /home/myhome/a.c //显示除 ...

  3. linux grep sed awk

    $ grep ‘test’ d* 显示所有以d开头的文件中包含 test的行. $ grep ‘test’ aa bb cc 显示在aa,bb,cc文件中匹配test的行. $ grep ‘[a-z] ...

  4. Linux(8):linux三剑客sed和awk & Shell 编程(1)

    linux 三剑客 之 sed # sed 是什么? # sed : 字符流编辑器 Stream Editor: sed 擅长 替换.取行等 # sed 的功能与版本: 处理纯文本文件.日志.配置文件 ...

  5. SED&AWK

    SED   1.sed是流编辑器(stream editor)缩写,作用主要是文本替换 命令格式:sed ‘s/pattern/replace_string/' file或者cat file | se ...

  6. 快速理解linux流编辑器sed命令

    原创 杜亦舒性能与架构 之前介绍过 awk 命令,sed 命令同样是非常重要的文本处理工具,涉及到linux shell开发时,几乎是避不开这两大利器的 sed 是 stream editor 的简写 ...

  7. Linux下的sed流编辑器命令详解

    sed是stream editor的简称,也就是流编辑器.它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内 ...

  8. Linux sed 流编辑器

    sed是stream editor的简称,也就是流编辑器.盗用一张图片解释原理 命令格式: SYNPPSIS: sed [OPTION]… {script-only-if-no-other-scrip ...

  9. Linux三剑客之sed流编辑器

    一.功能说明 Sed是Stream Editor(流编辑器)缩写,是操作.过滤和转换文本内容的强大工具.常用功能有增删改查,过滤,取行. 二.语法格式 Usage: sed [options] [se ...

随机推荐

  1. BPMN这点事-BPMN扩展元素

    什么是BPMN扩展元素?我们为什么要从BPMN元素中界定出一个扩展元素的子集?BPMN扩展元素是我们平时使用频率不高的BPMN元素,这些元素更多的面向开发人员而不是业务人员,它们强调流程执行的细节,例 ...

  2. 理解matplotlib绘图

    matplotlib是基于Python语言的开源项目,旨在为Python提供一个数据绘图包.Matplotlib 可能是 Python 2D-绘图领域使用最广泛的套件.它能让使用者很轻松地将数据图形化 ...

  3. 【英语】Bingo口语笔记(5) - 英式和美式英语的发音区别

  4. JFinal 部署在 Tomcat 下推荐方法(转)

    首先明确一下 JFinal 项目是标准的 java web 项目,其部署方式与普通 java web 项目没有任何差别.Java Web 项目在 Tomcat 下部署有一些不必要的坑需要避免,所以撰写 ...

  5. HDU 3078 Network

    简单的  RMQ:  先预处理得到  所有 节点的 公共祖先  和  dfs 得到所有节点的父亲节点:  然后  询问时,从自己出发向上找父亲, 然后  得到所有的节点:排序一下 不知道  这题这样也 ...

  6. typedef 深入剖析

    typedef是一个我们常常会用到的关键字,而这个关键字有许多陷阱或者说许多不为我们深入理解的地方.很多书上都是很简单地一笔代过,并没有真正地让我们理解这个关键字.本文对其进行详细地说明.综合网络上找 ...

  7. 【转】Linux设备驱动之I/O端口与I/O内存

    原文网址:http://www.cnblogs.com/geneil/archive/2011/12/08/2281367.html 一.统一编址与独立编址 该部分来自于:http://blog.ch ...

  8. 自己的一个LESS工具函数库

    自己大概在一年前开始使用LESS编写样式,现在感觉不用LESS都不会写样式了.现在写静态页面完全离不开LESS与Zen Coding,我可以不用什么IDE,但这两个工具却必须要,当然也强烈推荐看到这篇 ...

  9. ASP.NET静态页生成

    由于业务需要,得把页面按照模板页生成静态页面,所以自己就琢磨了下,写些思路,以备日后需要的时候用. 静态页生成用到最多的就是匹配跟替换了,首先得读取模板页的html内容,然后进行你自己定义的标签匹配, ...

  10. MySQL · 引擎特性 · InnoDB 崩溃恢复过程

    MySQL · 引擎特性 · InnoDB 崩溃恢复过程 在前面两期月报中,我们详细介绍了 InnoDB redo log 和 undo log 的相关知识,本文将介绍 InnoDB 在崩溃恢复时的主 ...