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. 【解题报告】[动态规划] CodingTrip - 携程编程大赛 (预赛第一场)- 聪明的猴子

    原题: 聪明的猴子 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Problem D ...

  2. 【转】Eclipse编辑shell的插件(shellEd)

    原文网址:http://blog.sina.com.cn/s/blog_a42d507e01019mlp.html Eclipse官方网站:http://download.eclipse.org/ 1 ...

  3. Linux/Unix shell 监控Oracle告警日志(monitor alter log file)

    使用shell脚本实现对Oracle数据库的监控与管理将大大简化DBA的工作负担,如常见的对实例的监控,监听的监控,告警日志的监控,以及数据库的备份,AWR report的自动邮件等.本文给出Linu ...

  4. SQLSERVER 检查字段值域并输出行数和值列表

    select * from ( SELECT 'C_DILEI' as fen,'地类' as fcn, 'NVARCHAR'as ftype, '2'as flen, ( SELECT count( ...

  5. centos 安装mysql 登录进提示 Access denied for user 'root'@'localhost' (using password: NO)

    # service mysqld stop # mysqld_safe --user=mysql --skip-grant-tables --skip-networking & # mysql ...

  6. xampp 提示 This setting can be configured in the file "httpd-xampp.conf".

    错误提示如下: New XAMPP security concept: Access to the requested object is only available from the local ...

  7. Linux makefile教程之书写命令四[转]

    书写命令———— 每 条规则中的命令和操作系统Shell的命令行是一致的.make会一按顺序一条一条的执行命令,每条命令的开头必须以[Tab]键开头,除非,命令是紧跟 在依赖规则后面的分号后的.在命令 ...

  8. C++ STL算法系列6---copy函数

    现在我们来看看变易算法.所谓变易算法(Mutating algorithms)就是一组能够修改容器元素数据的模板函数,可进行序列数据的复制,变换等. 我们现在来看看第一个变易算法:元素复制算法copy ...

  9. 查找指定目录下的文件 .xml

    pre{ line-height:1; color:#9f1d66; background-color:#cfe4e4; font-size:16px;}.sysFunc{color:#5d57ff; ...

  10. UDP模式与TCP模式的区别

    1.TCP有连接状态,而UDP没有. 2.TCP应用层使用无需考虑包的大小及发送情况,而UDP需要. 3.TCP中IP包大小的决定者是Socket,而UDP为应用层.