`
ych4865
  • 浏览: 6792 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

sed学习笔记-进阶篇

    博客分类:
  • sed
sed 
阅读更多
-----------------------
进阶部分:

多行模式空间:对于多行内的数据进行匹配处理;

·N(Next)命令获取下一行到模式空间。
获取到的多行模式空间,使用\n匹配多行间的换行符,
^匹配模式空间(可多行)的首字符,$匹配模式空间(可多行)的末字符.

·对于一行内满足条件的先进行匹配,之后进行行间的匹配,
可以保证一行内有两个owner的情况下的匹配:
[root@localhost ~]# sed -f owner.sed sedtest.log
the installation guide
for xx
the installation guide shipped with xx
including the installation guide
and xx
the installation guide is xx

[root@localhost ~]# cat sedtest.log
the owner and operator
guide for xx
the owner and operator guide shipped with xx
including the owner and
operator guide and xx
the owner and operator guide is xx

[root@localhost ~]# cat owner.sed
s/owner and operator guide/installation guide/
/owner/{
N
s/ *\n/ /
s/owner and operator guide */installation guide\
/
}

·不使用脚本的第一行,将一行内全部匹配的先处理的情形时,
出现问题的分析:
[root@localhost ~]# cat owner.sed
/owner/{
N
s/ *\n/ /
s/owner and operator guide */installation guide\
/
}
#未先进行一行内先处理语句。
[root@localhost ~]# cat sedtest.log
the owner and operator
guide for xx
the owner and operator guide shipped with xx
including the owner and
operator guide and xx
the owner and operator guide is xx

[root@localhost ~]# sed -f owner.sed sedtest.log(结果中在#行加入了解释)
the installation guide
for xx
#上面处理的是源文件的1-2行,即第一次的匹配。
the installation guide
shipped with xx including the owner and
#上面处理的是源文件的3-4行,Next命令将第二个owner加入模式空间,在第一个owner匹配后,直接被打印,清除模式空间。
operator guide and xx
#该行不匹配owner,直接被打印,清除模式空间。
the installation guide
is xx
#匹配最后一个owner,并打印。
#总之,有第3个owner未匹配这个问题;以及最后空行被取消也是一个问题。

·使用Next时,最末行的注意事项。
#N在执行到最后行时,会出现错误,需要使用$!N:
[root@localhost ~]# cat sedtest.log
the owner and operator
guide for xx
the owner and operator guide shipped with xx
[root@localhost ~]# sed -f owner.sed sedtest.log
the installation guide
for xx
the installation guide
shipped with xx
[root@localhost ~]# cat owner.sed
/owner/{
$!N
s/ *\n/ /
s/owner and operator guide */installation guide\
/
}
#未使用$!时,未对最后行进行处理:
[root@localhost ~]# sed -f owner.sed sedtest.log
the installation guide
for xx
the owner and operator guide shipped with xx
[root@localhost ~]# cat owner.sed
/owner/{
N
s/ *\n/ /
s/owner and operator guide */installation guide\
/
}

·D(Delete)命令:
进行多行模式空间内的删除动作;
和d命令的区别:
d是对整个模式空间的内容进行删除处理,
而D是对模式空间的首行进行处理。
一个例子:
测试的文件,需要将大于1行的连续空行删除成1行。
[root@localhost ~]# cat -A del_test.log
1spaceline:$
$
2spaceline:$
$
$
3spaceline:$
$
$
$
end$
使用d进行多行模式空间删除:
[root@localhost ~]# cat del.sed
/^$/{
N
/^\n$/d
}
#得出的结果,出现2行连续时都被删除:
[root@localhost ~]# sed -f del.sed del_test.log
1spaceline:

2spaceline:
3spaceline:

end

#变更d为D:
[root@localhost ~]# cat del.sed
/^$/{
N
/^\n$/D
}
#结果是符合我们的要求的:
[root@localhost ~]# sed -f del.sed del_test.log
1spaceline:

2spaceline:

3spaceline:

end

·P(Print)多行模式中的打印命令:
打印多行模式空间中的第一行;
一般应用在N之后,D之前,用于输出处理行(一般时第一行),
由于替换等处理后,接着需要删除该行后处理下一行,所以不会处理输出,所以需要使用P;
一般使用N-P-D的循环,来实现逐行进行加入处理先行末尾和后行行首结合匹配的功能;
而且可实现后行可以再次开始匹配的功能,因为是逐行删除的。
一个例子:
#在行末的UNIX和下行前system间加入OS;测试文件:
[root@localhost ~]# cat ptest.log
the UNIX
system is xx,UNIX
system is yy,
the UNIX system.
#脚本:使用了N-P-D循环:
[root@localhost ~]# cat ptest.sed
/UNIX$/{
N
/\nsystem/{
s// OS&/
P
D
}
}
[root@localhost ~]# sed -f ptest.sed ptest.log
the UNIX OS
system is xx,UNIX OS
system is yy,
the UNIX system.


·保持空间:
保持空间:用于临时存储模式空间的数据;
对模式空间和保持空间进行操作的命令:
Hold:H和h,将模式空间数据追加或拷贝到保持空间;(在原有内容后先加换行符)
Get:G和g,将保持空间数据追加或拷贝到模式空间;(在原有内容后先加换行符)
Exchange:x,将模式空间数据和保持空间的数据进行交换。

一个简单的数据切换的例子:
[root@localhost ~]# sed -f space.sed spacetest.log
22
11
222
111
[root@localhost ~]# cat space.sed
/1/{
h
d
}
/2/{
G
}
[root@localhost ~]# cat spacetest.log
11
22
111
222
#将含1行和含2行进行交换;将含1行放入保持空间后删除,以禁止输出;
获取到含2行时,追加获取保持的含1行,输出;

一个替换一类字符为统一大写的字符的例子(具体字符可以不指定,只要指定具体位置即可)
[root@localhost ~]# sed -f matchspace.sed matchspace.log
find the MATCH statement
consult the GET statement
using the READ statement
[root@localhost ~]# cat matchspace.log
find the Match statement
consult the get statement
using the ReaD statement
[root@localhost ~]# cat matchspace.sed
/the .* statement/{
h
s/.* the \(.*\) statement.*/\1/
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
G
s/\(.*\)\n\(.* the \).*\( statement.*\)/\2\1\3/
}
#先找到the .. statement相关语句,将原语句保存到保持空间内;
通过s获取到待替换单词;使用y进行小写转换为大写;
将保持空间原数据追加获取到模式空间;
通过s将多行模式空间内的需要的3段进行分别分离,再在替换部分进行重新组合。(重点)

一个进行空间内容相互交换的例子:
[root@localhost ~]# sed -f html.sed htmltest.log
<p>start line
a space line as:</p>

<p>end line
last space line as:</p>

[root@localhost ~]# cat htmltest.log
start line
a space line as:

end line
last space line as:

[root@localhost ~]# cat html.sed
/^$/!{
H
d
}
/^$/{
x
s/^\n/<p>/
s/$/<\/p>/
G
}
#将非空行保存到保持空间;遇到空行,进行x交换;进行匹配替换后,再读入空行进行输出。

以上的例子在末行不为空行时会出现不输出最后一个后的内容。
为解决这个问题:
[root@localhost ~]# sed -f html.sed htmltest.log
<p>start line
a space line as:</p>

<p>end line
last space line as:</p>

[root@localhost ~]# cat htmltest.log
start line
a space line as:

end line
last space line as:
[root@localhost ~]# cat html.sed
${
/^$/!{
        H
        s/.*//
        }
}
/^$/!{
H
d
}
/^$/{
x
s/^\n/<p>/
s/$/<\/p>/
G
}
#加入前面的一个部分,使用$匹配文件的最后一行;
如该行不是空行,则将内容保存到保持空间;再将模式空间的内容变为空行,
则向下达到空行流程,交换内容,加入空行输出。(可以看到有一个缺陷:在原文件基础上末行后加了一个空行)

·流控制命令:
流控制命令::标签;b分支命令;t测试命令;
:label:定义标签名;
/pattern/b <label>:匹配模式后,如有label,程序跳到label后执行;如无,直接跳到脚本末尾;
/address/t <label>:如匹配行的s命令执行成功,则执行t(可有或无label)

b的使用模式:
do-while形式:
:top
command1
/pattern/b top
command2

if(条件符合0)形式:
/pattern/b end
comand1
:end
comand2

if-else形式:
/pattern/b docmd2
comand1
b
:docmd2
comand2

·关于流控制,参考的一个例子:
#跨行将@f1(..),改为\fB..\fB
[root@localhost ~]# cat streamtest.log
start one line test:
start @f1(test1) and @f1(test2) end;
start multi line test:
start @f1(testtest
add1
add2
add3
endadd testend)
all end
[root@localhost ~]# sed -f stream.sed streamtest.log
start one line test:
start \fBtest1\fB and \fBtest2\fB end;
start multi line test:
start \fBtesttest
add1
add2
add3
endadd testend\fB
all end
[root@localhost ~]# cat stream.sed
:begin
/@f1(\([^)]*\))/{
s//\\fB\1\\fB/g
b begin
}
#查找一行内存在的所有符合模式项,使用b begin来循环匹配替换。
/@f1(.*/{
N
s/@f1(\([^)]*\n[^)]*\))/\\fB\1\\fB/g
t again
b begin
}
#查找多行上的符合模式项,如无匹配,使用b again来循环读入下一行;匹配成功走t again。
:again
P
D
#again后操作:如替换成功一次,则打印第一行,删除第一行,后续行继续进行匹配。

·一个比较综合的例子:(对于两行内的模式进行匹配)
#测试文件,需要查找关键字“I love apple”
[root@localhost ~]# cat fintest.log
the first line:test for first line,I love apple,end
the second line:test for second line,
I love apple,end
the fourth line:test for two lines,I love
apple,end
the sixth line:all end
#测试结果:
[root@localhost ~]# sed -f fin.sed fintest.log
the first line:test for first line,I love apple,end
I love apple,end
the fourth line:test for two lines,I love
apple,end
#脚本:(为了便于理解,直接在脚本内使用#号开始解释)
[root@localhost ~]# cat fin.sed
/I love apple/b
#对读入的第一行进行匹配,如匹配,跳出,打印。
$!N
#如上行未匹配,对于非最后行,读入下一行。
h
#保持到保持空间。
s/.*\n//
#去除第一行,保留第二行。
/I love apple/b
#对第二行进行匹配,如匹配,跳出,打印。
g
#如上行未匹配,读入保持空间内容。
s/ *\n/ /
#去除两行间的换行符和可能有的多余空格(类似合并为一行)
/I love apple/{
g
b
}
#对处理后的合并行进行匹配,如匹配,输出原始的两行,跳出,打印。
g
D
#如3种情况都未匹配,删除第一行,继续进行。

·题外话:
上面的例子:
修改文件:
[root@localhost ~]# cat fintest.log
xx
the second line:test for second line,
the fourth line:test for two lines,I love
apple,end
the sixth line:all end
[root@localhost ~]# sed -f fin.sed fintest.log
the fourth line:test for two lines,I love
apple,end
#感觉会有second line也被打印的问题,结果没有这样的问题,暂时不知道原因。

·参考:
sed & awk:Doughherty & Robbins.
分享到:
评论

相关推荐

    老男孩Linux运维笔记--文字版

    这份笔记以其实践性强、实用价值高的特点,深受广大Linux运维人员的喜爱,是日常学习和工作中不可或缺的参考资料。 在Linux运维的世界里,掌握基础与进阶知识至关重要。首先,你需要了解Linux操作系统的基本结构和...

    超详细的linux学习笔记

    这份"超详细的Linux学习笔记"涵盖了Linux运维管理的多个重要方面,包括DNS(Domain Name System)、Samba、Apache、Sendmail以及常用的Linux命令。让我们逐一探讨这些知识点。 首先,DNS是互联网上的名称解析服务,...

    Shell 学习笔记 word ppt

    **Shell学习笔记** Shell,全称为命令行解释器或Shell脚本,是Unix及类Unix系统(如Linux、macOS)中的用户界面,它提供了一个交互式的环境,让用户通过命令行来执行各种系统操作。在计算机科学中,Shell是操作系统...

    Linux 学习笔记,基于《鸟哥的 Linux 私房菜 第四版(CentOS7)》以及各种的网络资源.zip

    这篇学习笔记结合了该书的内容以及网络上的各种资源,旨在帮助读者深入理解和掌握Linux操作系统的核心概念和技术。 首先,Linux的学习从基础开始,包括了解Linux的哲学和历史,理解什么是开源软件以及Linux发行版的...

    linux学习笔记_a50e41203d48205e65a2.zip

    Linux学习笔记是一个全面涵盖Linux操作系统基础知识的资源集合,旨在帮助初学者和进阶者深入了解这一开源操作系统的核心概念、命令行工具以及系统管理技巧。在这个压缩包中,你将找到一系列有关Linux的学习材料,...

    perl的学习笔记1

    综上所述,"perl的学习笔记1"涵盖了Perl语言的基础语法、核心特性、数据结构、文件操作、正则表达式、模块使用以及错误处理等多个方面的知识,对于初学者和进阶者都是极好的学习资源。通过阅读和理解这些笔记,你...

    最全的java学习笔记(必看).docx

    Java学习笔记是初学者和进阶者深入理解Java编程语言的重要参考资料。这份文档详细介绍了Java技术的基础,涵盖了从编程语言的基本概念到实际开发环境的配置,再到语言核心要素的运用。下面将对这些知识点进行深入解析...

    unix学习笔记(网上转来的,和朋友们一起分享)

    这篇"Unix学习笔记"显然是为了帮助初学者掌握Unix的基础知识和操作技巧。 首先,让我们从"Chapter 1"开始,这通常会涵盖Unix的历史、基本概念以及安装。在这一章,你可以期待了解Unix是如何诞生的,它与Linux和类...

    linux_learning:linux学习笔记

    标题"linux_learning:linux学习笔记"表明这是一份关于Linux系统学习的资料,其中可能包含了从基础到进阶的各种知识点。描述中的"linux_learning"再次强调了这个主题,暗示这份笔记可能是系统性、全面的学习资源。 ...

    【PDF版本】老男孩教育Linux高端运维及云计算架构师-就业班20170513V9.pdf

    - **sed命令**:学习使用sed进行文本处理。 - **Shell编程基础**:掌握Shell脚本的基本语法和编程技巧。 - **awk命令**:学习使用awk进行复杂的数据处理。 - **计算机网络基础**:理解网络基础知识及TCP/IP协议栈。 ...

    学linx的笔记和代码

    在深入探讨Linux学习笔记和代码之前,让我们先理解一下标题和描述中提到的关键概念。"linx"很可能是"Linux"的拼写错误,这里指的是Linux操作系统,一个开源且广泛应用于服务器、嵌入式系统和个人计算机的操作系统。...

    Linux命令、基本命令、高级指令

    - `Linux基础指令黑马笔记.txt` 可能提供了初学者友好的教程,包括上述基础命令的解释和示例。 - `Linux进阶指令.txt` 可能涵盖了更多高级用法和技巧,如shell脚本编程、进程管理等。 通过深入学习这些命令和指令...

    16日-23日的shell 笔记.rar

    "16日-23日的shell笔记"涵盖了从基础到进阶的多个shell知识点,让我们逐一深入探讨。 首先,让我们了解什么是Shell。Shell是操作系统提供的一种命令解释器,它作为用户与系统内核交互的接口。常见的Shell有Bash...

    Linux笔记

    【Linux笔记】是一份关于Linux操作系统的学习资料,主要聚焦在理解和使用Linux系统的基础知识和进阶技巧上。这篇笔记可能是由一位经验丰富的IT从业者或爱好者编撰,旨在帮助读者掌握这个开源操作系统的核心概念和...

    Linux基础.zip

    压缩包中的文档如"鸟哥linux私房菜笔记"和"《鸟哥的Linux私房菜-基础篇》第四版"是经典的学习材料,涵盖了这些基础知识。 3. **Shell脚本**:Linux Shell是用户与操作系统交互的工具,而Shell脚本则是用Shell语言...

    linux从入门到精通配套笔记

    进阶指令包括grep(搜索文本)、sed(流编辑器)、awk(数据处理工具)、find(查找文件)、du(磁盘使用情况)、top(实时监控系统状态)等。掌握这些命令能帮助你更好地管理和维护系统。 四、Linux练习题 通过...

    linux与unix shell编程指南

    通过阅读这本书和相关的读书笔记,读者不仅可以学习到基本的shell编程知识,还能深入理解Linux和Unix系统的工作原理,从而更好地管理和自动化日常工作。这本书对于系统管理员、开发者以及所有希望提高Linux终端技能...

    《LINUX与UNIX SHELL编程指南》

    《LINUX与UNIX SHELL编程指南》是一本深入讲解Linux和...结合书中的实例和《LINUX与UNIX SHELL编程指南》读书笔记-二次发布版.pdf,学习效果会更佳,因为笔记通常会提炼关键概念并提供实践经验,有助于巩固理论知识。

    ops_doc-master.zip

    2. **Shell脚本进阶**:如使用正则表达式进行文本匹配,awk和sed命令的高级用法,以及如何通过cron实现定时任务。 3. **Python基础**:介绍Python的语法特性,如数据类型(如列表、元组、字典)、流程控制(if-else...

Global site tag (gtag.js) - Google Analytics