shell文本过滤编程(九):sed命令

【版权声明:转载请保留出处:blog.csdn.net/gentleliu。Mail:shallnew at 163 dot com】

sed和awk类似,是很重要的文本过滤工具。

调用sed和调用awk一样,有三种方式:

1. 在命令行键入命令;

2.将sed命令插入脚本文件,然后调用sed;

3. 将sed命令插入脚本文件,并使sed脚本可执行。

使用sed命令行格式为:

sed [option] ‘sed cmd’ inputfile

使用sed脚本文件,格式为:

sed [option] -f sed_script_file.sed inputfile

无论何种方式,如果sed没有指定输入文件,sed从标准输入中接受输入,一般是键盘或重定向结果。使用sed无论命令是什么,sed并不与初始化文件打交道,它操作的只是一个拷贝,然后所有的改动如果没有重定向到一个文件,将输出到屏幕。

sed选项如下:

-e进行多项编辑,即对输入行应用多条sed命令时使用

-n取消默认的输出

-f指定sed脚本的文件名

Sed有如下命令:

p 打印匹配行

= 显示文件行号

a \ 在定位行号后附加新文本信息

i \ 在定位行号后插入新文本信息

d 删除定位行

c \ 用新文本替换定位文本

s 使用替换模式替换相应模式

r 从另一个文件中读文本

w 写文本到一个文件

q 第一个模式匹配完成后推出或立即推出

l 显示与八进制 A S C I I代码等价的控制字符

{ } 在定位行执行的命令组

n 从另一个文件中读文本下一行,并附加在下一行

g 将模式2粘贴到/pattern n/

y 传送字符

n 延续到下一输入行;允许跨行的模式匹配语句

下面来讲一下sed的各种命令。本系列关于sed的示例使用以下文本文件:

#cat passwd
root:x:0:0:root:/root:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
operator:x:37:37:Operator:/var:/bin/sh
ftp:x:83:83:ftp:/home/ftp:/bin/sh
nobody:x:99:99:nobody:/home:/bin/sh
sshd:x:103:99:Operator:/var:/bin/sh
#

1.    p命令

1)    使用P命令打印文件内容。

#sed 'p' passwd
root:x:0:0:root:/root:/bin/sh
root:x:0:0:root:/root:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
operator:x:37:37:Operator:/var:/bin/sh
operator:x:37:37:Operator:/var:/bin/sh
ftp:x:83:83:ftp:/home/ftp:/bin/sh
ftp:x:83:83:ftp:/home/ftp:/bin/sh
nobody:x:99:99:nobody:/home:/bin/sh
nobody:x:99:99:nobody:/home:/bin/sh
sshd:x:103:99:Operator:/var:/bin/sh
sshd:x:103:99:Operator:/var:/bin/sh
#

发现每一行打印了两次,我们使用-n选项关闭默认的输出:

#sed -n 'p' passwd
root:x:0:0:root:/root:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
operator:x:37:37:Operator:/var:/bin/sh
ftp:x:83:83:ftp:/home/ftp:/bin/sh
nobody:x:99:99:nobody:/home:/bin/sh
sshd:x:103:99:Operator:/var:/bin/sh

# awk实现对比:

#awk '{print}' passwd
root:x:0:0:root:/root:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
operator:x:37:37:Operator:/var:/bin/sh
ftp:x:83:83:ftp:/home/ftp:/bin/sh
nobody:x:99:99:nobody:/home:/bin/sh
sshd:x:103:99:Operator:/var:/bin/sh
#

使用sed不一定要打印所有行出来,我们可以定位到某一行对其进行操作,使用s e d在文件中定位文本的方式:

x                         x为一行号,如 1

x,y                         表示行号范围从x到y,如2,5表示从第2行到第5行

/pattern/                     查询包含模式的行。例如 / d i s k /或/[a-z]/

/pattern /pattern /             查询包含两个模式的行。例如 / d i s k / d i s k s /

pattern/ , x                 在给定行号上查询包含模式的行。如 / r i b b o n / , 3

x , /pattern/                 通过行号和模式查询匹配行。 3 . / v d u /

x,y!                        查询不包含指定行号 x和y的行。1 , 2 !

2)    打印第3行:

#sed -n '3p' passwd
operator:x:37:37:Operator:/var:/bin/sh
#

awk实现对比:

#awk '{if(NR==3)print}' passwd
operator:x:37:37:Operator:/var:/bin/sh
#

3)    打印2到4行:

#sed -n '2,4p' passwd
proxy:x:13:13:proxy:/bin:/bin/sh
operator:x:37:37:Operator:/var:/bin/sh
ftp:x:83:83:ftp:/home/ftp:/bin/sh
#

awk实现对比:

#awk '{if(NR<=4 && NR>=2)print}' passwd
proxy:x:13:13:proxy:/bin:/bin/sh
operator:x:37:37:Operator:/var:/bin/sh
ftp:x:83:83:ftp:/home/ftp:/bin/sh
#

4)    打印匹配行

#sed -n '/var/p' passwd
operator:x:37:37:Operator:/var:/bin/sh
sshd:x:103:99:Operator:/var:/bin/sh
# 

awk实现对比:

#awk '/var/{print}' passwd
operator:x:37:37:Operator:/var:/bin/sh
sshd:x:103:99:Operator:/var:/bin/sh
#

5)    打印最后一行

#sed -n '$p' passwd
sshd:x:103:99:Operator:/var:/bin/sh

2.    “=”命令,打印行号

#sed -n '/var/=' passwd
3
6

awk实现对比:

#awk '/var/{print NR}' passwd
3
6

如果打印行号及匹配行,必须使用两个sed命令,并使用 e选项。第一个命令打印模式匹配行,第二个使用 =选项打印行号,格式为 sed -n -e /pattern/p -e /pattern/=。

#sed -n -e '/var/p' -e '/var/=' passwd
operator:x:37:37:Operator:/var:/bin/sh
3
sshd:x:103:99:Operator:/var:/bin/sh
6
#
#awk '/var/{print $0 "\n" NR}' passwd
operator:x:37:37:Operator:/var:/bin/sh
3
sshd:x:103:99:Operator:/var:/bin/sh
6
#

3.    \a命令,在指定行后附加新文本

使用符号a \,可以将指定文本一行或多行附加到指定行后面。文本附加操作时,结果输出在标准输出上。要想在附加操作后编辑文本,必须保存文件,然后运行另一个 s e d 命令编辑它。这时文件的内容又被移至缓冲区。

#sed '/root/a\this line is add by sed\haha' passwd
root:x:0:0:root:/root:/bin/sh
this line is add by sedhaha
proxy:x:13:13:proxy:/bin:/bin/sh
operator:x:37:37:Operator:/var:/bin/sh
ftp:x:83:83:ftp:/home/ftp:/bin/sh
nobody:x:99:99:nobody:/home:/bin/sh
sshd:x:103:99:Operator:/var:/bin/sh
#
#awk '{print;if(/root/)print"this line is add by awk"}' passwd
root:x:0:0:root:/root:/bin/sh
this line is add by awk
proxy:x:13:13:proxy:/bin:/bin/sh
operator:x:37:37:Operator:/var:/bin/sh
ftp:x:83:83:ftp:/home/ftp:/bin/sh
nobody:x:99:99:nobody:/home:/bin/sh
sshd:x:103:99:Operator:/var:/bin/sh
#

4.    i\命令,和\a命令类似,只是插入文本在匹配行前一行

5.    \c命令,修改指定行

#sed '/root/c\this line is modify by sed\h' passwd
this line is modify by sedh
proxy:x:13:13:proxy:/bin:/bin/sh
operator:x:37:37:Operator:/var:/bin/sh
ftp:x:83:83:ftp:/home/ftp:/bin/sh
nobody:x:99:99:nobody:/home:/bin/sh
sshd:x:103:99:Operator:/var:/bin/sh
#awk '{if(/root/){print"this line is modify by awk"}else {print}}' passwd
this line is modify by awk
proxy:x:13:13:proxy:/bin:/bin/sh
operator:x:37:37:Operator:/var:/bin/sh
ftp:x:83:83:ftp:/home/ftp:/bin/sh
nobody:x:99:99:nobody:/home:/bin/sh
sshd:x:103:99:Operator:/var:/bin/sh
#

6.    d命令,删除匹配行

#sed '1,4d' passwd
nobody:x:99:99:nobody:/home:/bin/sh
sshd:x:103:99:Operator:/var:/bin/sh
#
#awk '{if(NR>4)print}' passwd
nobody:x:99:99:nobody:/home:/bin/sh
sshd:x:103:99:Operator:/var:/bin/sh
#

7.    s命令,替换行文本

格式为:[address [,address]] s/ pattern-to-find /replacement-pattern/[g p w n]

该命令在指定行([address [,address]]),使用S命令,将符合模式pattern-to-find的文本替换为文本replacement-pattern,p选项将打印出替换的行,g选项替换全局所有出现模式,缺省情况下只替换第一次出现模式。w  文件名 使用此选项将输出定向到一个文件。

现在我们来替换文件第1,2行的bin字符串,替换为sedtest:

# sed  '1,2s/bin/sedtest/' passwd
root:x:0:0:root:/root:/sedtest/sh
proxy:x:13:13:proxy:/sedtest:/bin/sh
operator:x:37:37:Operator:/var:/bin/sh
ftp:x:83:83:ftp:/home/ftp:/bin/sh
nobody:x:99:99:nobody:/home:/bin/sh
sshd:x:103:99:Operator:/var:/bin/sh

我们可以使用sed的-n选项以及s命令的p选项来仅仅打印被替换的行:

# sed -n '1,2s/bin/sedtest/p' passwd
root:x:0:0:root:/root:/sedtest/sh
proxy:x:13:13:proxy:/sedtest:/bin/sh

使用s命令的g选项可以替换当前行所有符合模式的地方:

# sed -n '1,2s/bin/sedtest/pg' passwd
root:x:0:0:root:/root:/sedtest/sh
proxy:x:13:13:proxy:/sedtest:/sedtest/sh

该命令使用awk实现较复杂。

8.    r命令,从另一个文件中读文本

从new.txt文件读取内容附加到文件符合模式的指定行后面。

# sed '3r new.txt' passwd
root:x:0:0:root:/root:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
operator:x:37:37:Operator:/var:/bin/sh
this line from new.txt
ftp:x:83:83:ftp:/home/ftp:/bin/sh
nobody:x:99:99:nobody:/home:/bin/sh
sshd:x:103:99:Operator:/var:/bin/sh

此操作使用awk较复杂。

9.    q命令,在符合模式行后面退出

# sed '/Operator/q' passwd
root:x:0:0:root:/root:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
operator:x:37:37:Operator:/var:/bin/sh
# awk '{print;if (NR >= 3)exit}' passwd
root:x:0:0:root:/root:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
operator:x:37:37:Operator:/var:/bin/sh

10.    l命令,显示文件控制字符

对之前使用new.txt文件稍作修改(加入一些控制字符)如下:

# cat new.txt
this line from new.txt
kkh

# 

使用l命令显示如下:

# sed  -n 'l' new.txt
this line from new.txt\033[B$
kkh$
\r$
#

Awk未发现有此功能。

11.    sed使用正则表达式进复杂替换

删除行首字母:

# sed 's/^[a-z]*//g'  passwd

在匹配文本后面增加文本:

# sed 's/[0-9][0-9]:/&8902:/g'  passwd
root:x:0:0:root:/root:/bin/sh
proxy:x:13:8902:13:8902:proxy:/bin:/bin/sh
operator:x:37:8902:37:8902:Operator:/var:/bin/sh
ftp:x:83:8902:83:8902:ftp:/home/ftp:/bin/sh
nobody:x:99:8902:99:8902:nobody:/home:/bin/sh
sshd:x:103:8902:99:8902:Operator:/var:/bin/sh

对password文件做如下操作:

a.    删除已:分隔的第一列

b.    将所有:替换为空格

c.    删除行尾sh

# sed 's/^[a-z]*://g' passwd  |  sed 's/:/ /g' | sed 's/sh$//g'
x 0 0 root /root /bin/
x 13 13 proxy /bin /bin/
x 37 37 Operator /var /bin/
x 83 83 ftp /home/ftp /bin/
x 99 99 nobody /home /bin/
x 103 99 Operator /var /bin/

删除行首两字符:

# echo "hello sed." | sed 's/^..//g'
llo sed.

删除行尾两字符:

# echo "hello sed." | sed 's/..$//g'
hello se

在sed字符串后面添加字符串” world”:

# echo "hello sed." | sed 's/sed/& world/g'
hello sed world.

awk和sed的比较,我目前片面看来,sed更适合修改编辑文件,尤其是要修改行中某一字符串的时候很方便;而awk更适合用来取出每一行按指定分割符号分割出来的信息。

awk更复杂,感觉更像一种编程语言一样,而sed更像一个工具,用少量代码可以轻松搞定一些处理。这两工具各取所长,有的时候可以联合使用,处理起文本来就更好了。

时间: 2024-07-30 22:55:23

shell文本过滤编程(九):sed命令的相关文章

Shell编程之---sed命令详解

sed 是一个非交互式文本编辑器,它可对文本文件和标准输入进行编辑 sed只是对缓冲区中原始文件的副本进行编辑,并不编辑原始的文件 sed命令调用的三种方式 1.在shell命令行输出命令调用sed sed  [option]  'sed cmd'  file 2.将sed命令插入脚本 sed  [option] -f  'sed.sh'  file #vi sed.sh    sed要调用的脚本为sed.sh #/file:/a\This is a test line!!! 调用脚本 #sed

shell编程基础-sed命令

linux之sed用法sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法sed命令行格式为:         sed [-nefri] 'command' 输入文本 常用选项:        -n∶使用安静(silent)模式.在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到屏幕上.但如果加上 -n 参数后,则只有经过 sed 特殊处理的那一行(或者动作)才会被列出来.  

shell文本过滤编程(八):awk之内置函数

[版权声明:转载请保留出处:blog.csdn.net/gentleliu.Mail:shallnew at 163 dot com] 这一节来见识一下a w k许多强大的字符串函数及其使用方法. 1. sub 和 gsub函数: 用法:sub( Ere, Repl, [ str ] ) gsub( Ere, Repl, [ str ] ) 在第三个参数给出字符串中查找满足Ere 参数指定的扩展正则表达式的字符串,并使用第二个参数替换之.如果未指定 In 参数,缺省值是整个记录($0 记录变量)

shell文本过滤编程(十):cut命令

[版权声明:转载请保留出处:blog.csdn.net/gentleliu.Mail:shallnew at 163 dot com] cut命令类似于awk,从行里面抽取信息,是一个功能弱化版的awk. cut命令格式为:cut [options] filename 其中options有: -d  指定与空格和t a b键不同的域分隔符.类似于awk的"-F". -f field  指定剪切域数 -c list  指定剪切字符数. 首先我们来处理按:分割的password文件: #

shell文本过滤编程(十一):paste命令

[版权声明:转载请保留出处:blog.csdn.net/gentleliu.Mail:shallnew at 163 dot com] 从字面上可以看出,paste命令和cut命令功能相反,cut命令是从文件行中取出字段,而paste命令是将文件行信息合并到一行. paste命令使用方法为: paste -d -s -file1 file2 -s选项是将文件行合并成一行. 比如现有如下文件: # paste 1.file name allen bob chris dyao # paste 1.f

Shell脚本编程与sed,awk工具的使用--9月15日课程作业

一.shell程序的运行原理 1.脚本 脚本或程序源文件是一种文本文件,将文本文件转换成机器指令有两种转换方式: 编译执行:预处理-->编译-->汇编-->链接:事先完成,结果:二进制程序文件 例如:C, C++ 解释执行:由解释器全程参与运行过程,每次读取一行,运行一行: 例如:  Python:程序控制结构,调用编程库完成程序编写: 库文件:功能模块,在编程中可调用: Bash:调用机器上命令程序文件进行程序编写: 外部命令:各应用程序提供: 2.原理 当shell运行一个程序时,会

shell文本过滤编程(一):grep和正则表达式

[版权声明:转载请保留出处:blog.csdn.net/gentleliu.Mail:shallnew at 163 dot com] Linux系统中有很多文件,比如配置文件.日志文件.用户文件等.文件中都包含了大量的信息,我们可以使用cat等命令轻松将其输出到屏幕,但如果要从文件中分析或提取数据,还需要其他工具来实现.而linux正好提供了这些工具:grep.awk.sed等.把这些工具使用好,可以极大地提高你的工作效率,对系统管理员分析数据有极大帮助,而对linux开发人员来说也可以在开发

shell文本过滤编程(一):grep和正則表達式

[版权声明:转载请保留出处:blog.csdn.net/gentleliu.Mail:shallnew at 163 dot com] Linux系统中有非常多文件,比方配置文件.日志文件.用户文件等.文件里都包括了大量的信息,我们能够使用cat等命令轻松将其输出到屏幕,但假设要从文件里分析或提取数据,还须要其它工具来实现.而linux正好提供了这些工具:grep.awk.sed等.把这些工具使用好,能够极大地提高你的工作效率,对系统管理员分析数据有极大帮助,而对linux开发者来说也能够在开发

shell文本过滤编程(二):awk之基础

[版权声明:转载请保留出处:blog.csdn.net/gentleliu.Mail:shallnew at 163 dot com] 上一节说到了grep命令,grep命令主要用在获取符合规则的行信息.本节要讲的awk在对某文件或字符串中获取指定文本域有较强大的功能. a w k语言的最基本功能是在文件或字符串中基于指定规则浏览和抽取信息. a w k抽取信息后,才能进行其他文本操作.完整的 a w k脚本通常用来格式化文本文件中的信息. 在命令行上调用awk命令式最常用的使用awk的方式: