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
I 

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. MySQL Database on Azure - 利用PowerShell快速创建使用数据库服务

    如果您的应用需要通过脚本快速创建一个或多个MySQL数据库,MySQL Database on Azure目前开放了对于PowerShell的支持,可以帮助您快速利用自动化脚本进行数据库服务的创建.管 ...

  2. Write operations are not allowed in read-only mode错误

    (转+作者个人理解) 最近在配置 Structs, Spring 和Hibernate整合的问题: 开启OpenSessionInViewFilter来阻止延迟加载的错误的时候抛出了这个异常: org ...

  3. ecshop 文章列表页调用描述信息啊

    1.打开 includes/lib_article.php文件 将 $sql = 'SELECT article_id, title, author, add_time, file_url, open ...

  4. swun 1612 合并果子

      //思路:这题思路似乎很简单,每次取出最小的两个堆合并, //但是由于数据太大,不能采取每次进行排序的方式,所以 //想到用优先队列,以数据小的优先级更高为标准,但是 //优先队列中的数据默认情况 ...

  5. 【Android】SDK工具学习 - bmgr

    bmgr官方文档 我自己的理解就是bmgr也是一款命令行工具,主要操作Android设备中的Backup Manager(支持API8.0以上的ADT) 主要就是备份(Backup)和还原(Resto ...

  6. 更新Code First生成的数据库

    1,首次访问时会自动生成数据库 2,某个Model增加一个字段后,再次访问会报,数据库不是最新 操作 1,Enable-Migrations 注意选择Default project为Star.Core ...

  7. synchronized作用范围及用法

    1.多线程的同步: 1.1.同步机制: 在多线程中,可能有多个线程试图访问一个有限的资源,必须预防这种情况的发生.所以引入了同步机制:在线程使用一个资源时为其加锁,这样其他的线程便不能访问那个资源了, ...

  8. 关于asp.net中页面事件加载的先后顺序

    一.ASP.NET 母版页和内容页中的事件 母版页和内容页都可以包含控件的事件处理程序.对于控件而言,事件是在本地处理的,即内容页中的控件在内容页中引发事件,母版页中的控件在母版页中引发事件.控件事件 ...

  9. android技巧:EditText输入错误时该怎样提示用户

    验证用户输入内容(EditText)应该及时准确的告诉用户,那么在Android系统中提示用户通常有以下做法: 1) 使用Toast提示 1 Toast.makeText(this, "邮箱 ...

  10. struts2类型转换与校验总结

    1.struts2的类型转换分为全部变量转变和局部变量转变. 2.struts2对8中常见的基本类型的属性变量,可以自动转换.如果是User对象,可以手动简历UserAction-coversion. ...