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. HDU 5269 ZYB loves Xor I (二分法)

    题意: 给出一个序列,对每两个数求异或结果后取最低位的1出来作为一个数,然后求这些数字的和.比如:{a,b,c},结果是lowbit(a^b)+lowbit(a^c)+lowbit(b^a)+lowb ...

  2. erl_0013 erlang 带参数模块 parameterized modules are no longer supported

    code: -module(mod_test, [Name]). -export([show/0]). show() -> io:format("show:~p~n",[Na ...

  3. python 包管理

    如果导入的模块和主程序在同个目录下,直接import就行了 2.如果导入的模块是在主程序所在目录的子目录下,可以在子目录中增加一个空白的__init__.py文件,该文件使得python解释器将子目录 ...

  4. jQuery事件绑定方式(转)

    bind() 简要描述 bind()向匹配元素添加一个或多个事件处理器. 使用方式 $(selector).bind(event,data,function) event:必需项:添加到元素的一个或多 ...

  5. 在SQL语言中,join什么时候用,什么时候不用啊?请高手举例解释一下。谢谢

    JOIN 在内连接时,可以不使用,其它类型连接必须使用.如SELECT * FROM TABLEA INNER JOIN TABLEB ON A.ID=B.ID可以这样写:SELECT * FROM ...

  6. cocos2dx lua中继承与覆盖C++方法

    cocos2dx的extern.lua中的class方法为lua扩展了面向对象的功能,这使我们在开发中可以方便的继承原生类 但是用function返回对象的方法来继承C++类是没有super字段的,这 ...

  7. selenium python (十五)控制滚动条操作

    #!/usr/bin/python# -*- coding: utf-8 -*-__author__ = 'zuoanvip' #一般用到操作滚动条的两个场景    #注册时的法律条文的阅读,判断用户 ...

  8. iOS学习笔记之回调(一)

    什么是回调 看了好多关于回调的解释的资料,一开始总觉得这个概念理解起来有点困难,可能是因为自己很少遇到这种类型的调用吧.探索良久之后,才算有点启发,下面是自己的一点理解. 我们知道,在OSI网络七层模 ...

  9. 使用FTP搭建YUM

    VSFTP搭建YUM源 1.安装FTP [root@FTP kel]# rpm -qa |grep vsftp vsftpd-2.2.2-6.el6_0.1.x86_64 首先需要安装的ftp软件为v ...

  10. 传统IT大佬们,路在何方?

    [文/ 任英杰] 2014年第一季度季报陆续出台,互联网公司无疑仍是璀璨明星,一路凯歌,而与互联网企业的蒸蒸日上形成鲜明对照的是传统IT企业的集体黯然失色.分析一下传统IT大佬们发布的数据,用友营业收 ...