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

sed学习笔记-基础篇

    博客分类:
  • sed
sed 
阅读更多
sed学习笔记:
-----------

·一般形式:
操作行范围(行号或模式匹配行范围)-操作符-操作对象-操作结果-行内操作方式
(在操作符前加!号,则对操作行范围外的行进行操作)
简单的例子如下:
[root@localhost ~]# cat grade.log
andy 86 78 99 56
lily 66 70 59 56
lucy 77 78 69 56
steve 82 78 87 56
ann 80 78 90 56
匹配含lucy的行到结尾行之外的行,进行删除操作:
[root@localhost ~]# sed '/lucy/,$!d' grade.log
lucy 77 78 69 56
steve 82 78 87 56
ann 80 78 90 5
匹配含lucy的行到含xx的行,但是由于到结尾行都未匹配到xx的行,所以lucy行后的行都会进行删除操作:
[root@localhost ~]# sed '/lucy/,/xx/d' grade.log
andy 86 78 99 56
lily 66 70 59 56

·分组命令:
对于操作行范围之后的操作符命令可以有多个,多个操作命令使用大括号括起来,多个命令都对操作行范围的行进行操作;
一个简单的例子如下:
[root@localhost ~]# cp grade.log grade.log.bak
对于操作行范围内,进行两个操作:删除含Steve行和修改56为xx:
[root@localhost ~]# sed -i '/lucy/,/xx/{/steve/d;s/56/xx/}' grade.log
[root@localhost ~]# cat grade.log
andy 86 78 99 56
lily 66 70 59 56
lucy 77 78 69 xx
ann 80 78 90 xx
[root@localhost ~]# cat grade.log.bak
andy 86 78 99 56
lily 66 70 59 56
lucy 77 78 69 56
steve 82 78 87 56
ann 80 78 90 56

·sed一般使用的场景:
对于一个文件的多重处理;
对于多个文件的同一套策略处理;
获取范围行,对于相应行进行分别的处理。

·替换操作:
一般形式:
行地址/s/模式/替换符/标识
其中,
分割符:
可以不是/,可以是其他字符,但是选择的分割符,不要是正则表达式符和替换文本内的字符。

替换符:
有几点特殊的字符:
1.&,使用模式匹配部分的内容进行替换;
2.\n,n为数字,代表替换在模式匹配部分第n个“\(”和"\)"括起来的部分;
3.\,作为转义符,也可以转义换行符,从而产生多行的替换符。

标识:
可以为:
1.n(1-512),表示对一行内模式识别到的第几次进行替换处理;
2.g,对于全部模式识别到的,都进行替换处理;
3.p,打印匹配到模式空间的内容;
4.w file,模式空间的内容写入file

针对以上规则的几个例子:
使用#作为分割符:
[root@localhost ~]# echo "/dev/null" |sed 's#/dev/null#devnull#'
devnull

替换符:
使用&替换模式匹配到的字符,加入|plus|便于观察:
[root@localhost ~]# echo "one:two" |sed 's/.*:/&|plus|/'
one:|plus|two

使用\n复制模式匹配的内容作为替换符的一部分(为了便于查看,下例sed使用#作为分割符):
[root@localhost ~]# echo "one:two" |sed 's#\(.*\):\(.*\)#\2:\1#'
two:one

使用\在替换符中进行转义换行符,形成多行输出的例子;(较复杂,只想了解基本内容的话,可跳过)
[root@localhost ~]# cat nseptest.sed
{
s/one/\
\
3lineone/
s/://
s/two/\
\
5linetwo/
s/$/\
/
}
在one前加两行空行,去除:号,在two前加一行空行,在末尾再加入一行空行;
为了便于观察,将sed的结果赋予cat -A以便显示出结尾的$符:
[root@localhost ~]# echo "one:two" |sed -f nseptest.sed |cat -A -
$
$
3lineone$
$
5linetwo$
$

最后,标识符的规则比较简单,例子如下:
[root@localhost ~]# echo "one:two" |sed 's/o/x/g'
xne:twx
[root@localhost ~]# echo "one:two" |sed 's/o/x/2'
one:twx
[root@localhost ~]# echo "one:two" |sed 's/o/x/2w file'
one:twx
[root@localhost ~]# cat file
one:twx

·删除操作:
删除符合要求行,清空模式空间数据,重新读取新的数据行。
几个简单的例子:
[root@localhost ~]# cat grade.log
andy 86 78 99 56
lily 66 70 59 56
lucy 77 78 69 56
steve 82 78 87 56
ann 80 78 90 56
[root@localhost ~]# sed '/lily/,/steve/d' grade.log
andy 86 78 99 56
ann 80 78 90 56
删除空行:
[root@localhost ~]# cat name.log
andy,3233:xx
steve,77899:yy


end,0:z
[root@localhost ~]# sed '/^$/d' name.log
andy,3233:xx
steve,77899:yy
end,0:z
删除Steve以及之后的行:
[root@localhost ~]# sed '/steve/,$d' name.log
andy,3233:xx

·插入,追加,修改操作:
插入和追加操作只能对单行进行操作;而且加入的行对模式空间没有影响,也不会执行后面的执行语句。
修改操作可以对多行进行操作,相当于先将匹配的多行删除,然后,替换为输入数据。

一个综合的例子:
在含andy行前加入“insertline”;在含末尾行后追加“appendline”;将含82数据行,替换为“82changeline”:
[root@localhost ~]# sed -e '/andy/i insertline' -e '$a appendline' -e '/82/c 82changeline' grade.log
insertline
andy 86 78 99 56
lily 66 70 59 56
lucy 77 78 69 56
82changeline
ann 80 78 90 56
appendline
[root@localhost ~]# cat grade.log
andy 86 78 99 56
lily 66 70 59 56
lucy 77 78 69 56
steve 82 78 87 56
ann 80 78 90 56

·转换操作:
进行字符的转换操作,注意此操作和单词无关,只是相应位置的字符和字符的转换:
[root@localhost ~]# echo aBcde|sed 'y/abc/XYZ/'
XBZde

·next命令:
将模式空间的行移除,输入下一行,进行下一个执行命令;(和awk的next操作类似)
此操作改变了sed正常的控制流(读入一行,全部语句执行完成,再读取下一行);
产生的结果就是模式空间中的行,不再执行next之后的语句;读入的下一行,不会执行next之前的语句。
一个简单的例子:
将含“Steve”行后面的空行删除:
[root@localhost ~]# cat name.log
andy,3233:xx
steve,77899:yy

empty

end,0:z
[root@localhost ~]# sed '/steve/{n;/^$/d}' name.log
andy,3233:xx
steve,77899:yy
empty

end,0:z
#注意:empty行后面的空行未删除。

·读入文件,写入文件操作:
读入文件(r):适用于要将一个文件系统插入另一文件的特定行的情况:
写入文件(w):适用于将匹配行,分别写入单独文件的情况。
读入例子如下:
使用filename文件内的内容插入到FILENAME行后,此外可以删除FILENAME行:
[root@localhost ~]# sed -e '/FILENAME/r filename' -e '/FILENAME/d' grade.log
grade.log
andy 86 78 99 56
lily 66 70 59 56
lucy 77 78 69 56
steve 82 78 87 56
ann 80 78 90 56
[root@localhost ~]# cat filename
grade.log
[root@localhost ~]# cat grade.log
FILENAME
andy 86 78 99 56
lily 66 70 59 56
lucy 77 78 69 56
steve 82 78 87 56
ann 80 78 90 56

写出例子如下:
[root@localhost ~]# sed -e '/Sales/w salelist.log' -e '/Support/w suptlist.log' employees.txt
Emma Thomas:100:Sales
Alex Jason:200:Sales
Madison Randy:300:Support
Sanjay Gupta:400:Support
Nisha Singh:500:Sales
[root@localhost ~]# cat salelist.log
Emma Thomas:100:Sales
Alex Jason:200:Sales
Nisha Singh:500:Sales
[root@localhost ~]# cat suptlist.log
Madison Randy:300:Support
Sanjay Gupta:400:Support
[root@localhost ~]#

退出操作命令:
用于对于大文件进行操作,操作后即返回,不再继续查找以节省时间:
节省时间的例子如下:
[root@localhost ~]# time sed '10q' /var/log/anaconda.log
10:11:15 INFO    : 515308 kB are available
...
10:11:16 INFO    : loaded nfs_acl from /modules/modules.cgz

real    0m0.184s
user    0m0.000s
sys     0m0.017s
[root@localhost ~]# time sed -n '1,10p' /var/log/anaconda.log
10:11:15 INFO    : 515308 kB are available
...
10:11:16 INFO    : loaded nfs_acl from /modules/modules.cgz

real    0m0.525s
user    0m0.005s
sys     0m0.026s
当然,正常场景可能是匹配查找关键字,然后退出。
分享到:
评论

相关推荐

    Linux学习笔记【博文整理系列】

    学习linux的笔记,发到博文了,鉴于文档方便保存和查阅,发出来,免费的哈 博文来自http://blog.csdn.net/wklken,共12篇,类似手册,可快速练习和查阅,容易上手 文档列表: Linux笔记——vim常用操作及扩展补充...

    Linux学习笔记(强悍总结值得一看),细说linux基础知识,C,C++

    这篇Linux学习笔记涵盖了Linux的基础知识,包括C和C++编程环境,是初学者深入了解Linux的宝贵资源。 首先,让我们来探讨Linux的常用命令。在Linux的世界里,一切皆文件,包括硬件设备。掌握基本的命令行操作是至关...

    学习笔记2_用一个预训练模型提取特征-薛开宇1

    这篇学习笔记主要介绍了如何利用预训练的深度学习模型来提取图像特征,这在计算机视觉领域是非常常见的实践。预训练模型通常是在大规模数据集上如ImageNet上训练得到,具有很好的特征学习能力,可以用于各种图像处理...

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

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

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

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

    Linux基础.zip

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

    Java、Linux基础命令笔记.zip

    这篇笔记集合了作者在大学期间学习这两门技术的基础知识,旨在帮助初学者理解并掌握它们的核心概念。 首先,Java作为一种面向对象的编程语言,它的主要特点包括平台无关性、安全性以及高性能。Java程序通过编译成...

    linux服务器命令用法笔记

    本篇笔记主要针对Linux服务器中的常用命令及用法进行了详尽的总结,旨在帮助初学者快速上手,并为有一定经验的用户提供参考。 1. **基础命令** - `ls`:列出目录内容,通过`-l`选项可显示详细信息。 - `cd`:切换...

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

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

    Hadoop与HBase自学笔记

    这篇笔记详细指导了初学者如何从零开始构建Hadoop和HBase环境,对于想要学习分布式存储和计算的人来说,是一个宝贵的资源。通过这个过程,你可以深入了解Hadoop和HBase的工作原理,为后续的分布式应用开发打下坚实...

    Linux笔记

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

    全网最新整理linux常用命令列举-完整版

    对于Linux用户来说,熟练掌握各种命令行工具是日常工作的基础。本篇文章将详细列举并解释一些Linux系统中最常用的命令,帮助用户更好地理解和使用这个强大的操作系统。 1. **系统信息**: - `arch`:显示系统的...

    oneNote笔记(包含C++、LINUX、bat脚本等)

    这篇笔记集合涵盖了多个重要的IT领域,包括C++编程语言、Linux操作系统以及批处理脚本(bat脚本)。让我们逐一深入探讨这些知识点。 首先,我们来看看C++。C++是一种广泛应用的面向对象编程语言,它是C语言的扩展,...

    韩老师Linux2021系列教程

    在基础篇,教程会介绍Linux的安装过程,包括虚拟机上的安装和裸机安装,让你熟悉不同的安装选项和配置。接着,你将学习Linux的桌面环境,如GNOME、KDE或XFCE,以及如何进行基本的桌面操作,例如创建、删除文件和目录...

    Linux常用命令简介

    在IT领域,Linux操作系统是开发、管理服务器以及进行系统运维的重要平台。对于初学者和专业人士而言,掌握Linux...在学习过程中,参考Linux学习笔记和在线资源如iteye博客等,都能助你更好地理解这些命令的用法和功能。

    sell notebook

    【shell学习笔记】 在IT行业中,shell是一种强大的命令行接口,用于与操作系统交互。这篇"sell notebook"实际上是一个关于shell学习的笔记,涵盖了基础的shell命令、变量操作、重定向、脚本解释器以及特殊设备等...

    Lniux快速入门

    这篇“Linux快速入门”教程旨在为初学者提供一个简洁而全面的指引,帮助他们迅速熟悉这个强大的开源操作系统。我们将围绕标题和描述中提到的关键词“源码”和“工具”,探讨Linux的核心概念、常用命令行工具以及如何...

    linux常用命令之bash入门指南.zip

    这篇文档“linux常用命令之bash入门指南”旨在帮助初学者掌握Bash的基本用法和常用命令,从而更有效地在Linux环境中工作。 一、Bash简介 Bash是GNU项目的一部分,它是对早期的Unix Shell——Bourne Shell(sh)的一...

    运维实践指南

    通过以上内容,读者可以系统地学习到Linux系统管理、数据库管理、Web服务运维、存储技术、云服务和虚拟化、负载均衡等运维领域的核心知识,不仅能够加深理解,而且能够在实际工作中运用这些知识解决实际问题。

    我的评论:主要存放平时理论学习,选择java jdk源码分析,并发理论;面试,数据库,Linux,中间件,分布式,网络协议等方向

    这篇文档将深入探讨标题和...综上所述,这个"my-review-master"压缩包可能包含了一系列的学习资料和笔记,涵盖了上述各个领域的知识。通过深入学习这些内容,无论是提升个人技术水平,还是为面试做准备,都将大有裨益。

Global site tag (gtag.js) - Google Analytics