Sed 与Awk (第二版)学习笔记

  写在前言:作为一名系统管理员,特别是Linux(Unix)方向的,对于Sed和Awk 这两个工具,是必须得掌握的!

一、有关ED行编辑器

  发展历程:ED(Unix最初的行编辑器)——>EX(vi底层的行编辑器)——>grep&sed——>Awk

  ed:Unix最初行编辑器,可交互使用,每次可以处理一行,当打开一个文本或文件时,它都会停留在最后一行

  grep:是从ed中提取出来的,并可以做外部程序的行编辑命令,它作为执行一个编辑命令的硬连接

  sed:作为一个为特别目的面建立的编辑器,不可交互使用,面向字符流,专门用于执行脚本

  awk:作为一种可编程的编辑器,面向字符流,并可解释编辑命令脚本,废弃了sed的行编辑命令集,仿效C语言  

与ED相关

#ed test.txt  //打开test.txt文件,它是一个测试文件!

#ed test < scrpte-ed  //这样的执行ed的脚本,scrpte-ed里面就是ed的命令脚本

  相关的ed命令集:

p  ——>打印当前所在行,当然也可以指定地址打印出行,如120p,全局打印(grep):g/re/p

d  ——>删除当前所在行,当然也可以指定地址删除,如100d,匹配正则表示为:[g]/regular/d,g表示全局(可选)

s  ——>替换命令,定义为:[g][address]s/pattern/replacement/flag[g],pattern为正则表达式,

      replacement为当前想替换的字符串,前面的g表示全局,后面的g表示同行中的所有,不只是第一个出现(默认是第一个出现为替换)     

      如g/installing/s/regular/replacestring/g,表替换文档中所有以installing开头的行r中内容为regular 为replacestring 

q  ——>退出,当在工作时,要连续两次输入q方可以退出ed

二、与SED和AWK相关

  SED 与 AWK 语法模式

command [options] script filename

  script为要执行的指令,假若它包含由shell可解释的空格或任意字符(如 * 和 $ ),那么它必须得用单括号引起

  在sed和awk中,每个指令都包含两个部分:模式和语句 ,其中 模式是由“/分隔的正则,语句指定一个或多个将被执行的动作

  1、sed

    调用方法:在命令行上指定编辑命令或将命令存放在一个文档中并在命令行上指定文档

  命令:

#sed [-n|-e] 'instruction' file  //只有多个命令一起时才加参数e,单引号的是要执行的命令,file是要进行操作的文档或文件

  如#sed 's/Installing/myreplace'  test.txt

  由于sed默认是输出所有输入的行的,加n可以阻止它自动输出,但这样也会是影响到每个要生成输出的指令,所以我们要在instruction后加/p打印显示

  如#sed -n -e 's/Installing/myreplace' test.txt

#sed -f scriptfile file    //执行sed脚本,scriptfile为脚本名

#sed -f scriptfile file >  outputfile  //重定向IO将结果输出到outputfile文件中

下图总结sed的参数:

  2、awk

  调用方法与sed类似,可以在命令行上指定指令或创建脚本文件

#awk  '/pass/{instruction}' file    //指令中,必须得用大括号包起来

#awk -f[-F,] scriptfile file          //f意义与sed一样,F选项是将字段分隔符改变为逗号,可以让我们检索多个字段,如awk -F,'{print $1;print $2;print $3}' file

下图表示相关awk参数

   解释:awk记录,为每个输入行的解释;awk字段,为每个输入行上的每个单词(包括空格或制表符分隔);awk定界符,为一个或多个连续的空格或制表符。

  应用:允许在模式或过程中引用这些字段,其中$0 表整个输入行,$1/$2/$3````表示输入行上的各个字段

如:awk '/installing/{print $1}' test.txt //打印test文档中,带installing行的第一个字段

三、正则表达式

 1、元字符句点“.”与元字符星点“*

   句点表示,通配任何单个字符,如A.E,通配的可以有类似ACE/AEE/AKE等

   星点表示,通配它前面零个或多个字符,如A*E,可通配类似ASLOE/ACE/ALLOLOE等

   句点与星点合用,综合前面两个,如A.*E,可通配"A.E"匹配的字符,也可以是"A"和"E”间任意数目的字符

例子:#grep 'seten.' test.txt  //匹配“seten”后有任何一个字符的行,但不包括以seten结尾的行(除非行后有字符)

通配表示总表

 2、字符类

  它是对通配符的改进,使用方括号"[]"将字符列表括起来,其中每个字符占一个位置

如[W|w]hat  //它对大小写的匹配,非常好用,这样的就表示可以匹配"What"或"what"了,包括第一个字符是“W”或"w"的4个字符的字符串的行

当然也有个比较好用的取文章章节的标题,如#grep '\.H[12345]' ch0 [123]

以下是方括号相关参数的表

3、 字符的范围

  用字符“-”表示,匹配一些字符的范围。如[a-z]或[A-Z]或[0-9]

实例:[0-9z-aA-Z,.;:'"?] 或[0-9a-zA-Z][,.?;:'"]

当然匹配日期是比较好的,如

  YY-MM-DD

可以表示成:[0-9][0-9][-/][0-1][0-9][-/][0-3][0-9]    

其中“-”和"/"都是定界符,要确保它在字符类中解释为字面意思,即作为一个连字符而不是指一个通配范围 

4、POSIX字符类

  对正则表达式字符和操作符的含义进行了形式化,定义了两类正则表达式:基本的正则表达式(BRE),而grep和sed就是使用这种;扩展的正则表达式,而egrep和awk就是使用这种表达式。

以下是它的匹配相关的内容

 5、好用匹配命令

#grep '^$' test.txt    //统计文本中的空行数目

解释Norff与Troff:

  nroff 和 troff 是将文本文件格式化为打印机所需要的格式的 UNIX 命令 ( 和支持它们的程序) 。 (为开始打印还有其他的 UNIX 指令)。nroff 被设计来为行式打印机和高质量字母打印机格式化输出。troff设计用来为排字机格式化输出。 troff 包含一些只适合于排字机的特别的功能; 否则,这两个命令是一样的哪一个都可以使用。 一般来说,文本文件被设计和 nroff或 troff一起使用,文件包含内置的代码例如行距、页边空白设定、居中、定位键停止、段中不分页等等。 命令本身包括适用于整个文件的选项。 nroff 和 troff 提供有关和 IBM 的Script/VS 语言相同水平的格式化控制。一般来说,在这一个水平的文本格式语言有一个缺点,在非打印媒体 ( 例如在网络上)中再使用比较困难。 这一个缺点导致非输出特殊标记的发展,这个标记一般用标准通用标记语言定义,在标记中逻辑的或函数的描述被应文本元素,特殊设备程序能以适当的方式解释这些文本元素。 nroff/ troff 格式码的例子包括: .ce使文本的下一行居中。 .sp跳越一个行间距。 .ps 10使用 10 点的类型。 nroff/ troff 的一个流行的 UNIX 替换者的是叫做 TeX的格式程序。 TeX 被设计给使用者对字型选择和文本安排的很多控制,尤其是支持包含数学符号的文本。 如果你已经继承了一个 nroff/ troff 文件并需要将它转换成 HTML, 你可能能够找到一个工具将文件转换成 HTML"预先格式化"文本( 意思是文件将会看起来好像已经从某处被引进 )。 然而这可能是一些情形下的暂时解决办法,很有可能最后你必须手动剥去老的代码并用新的格式开始(使用 HTML 标签) 。

四、Sed 四种脚本类型

  忠告:编写脚本文件时,对于初学都最好的方法是一行一行编写并调试的方法,因为这样分隔开来就很容易看到那些命令实现了那些功能,当我们进行多行命令编辑时,若出现问题我们得一行一行往回删除,直到找到问题为止

  1、对同一文件进行多重编辑

s/^$/.LP/    ——>匹配所有空行,用“.LP”来取代
/^+  */d     ——>删除以“+”开始并包含行式打印机下划线的行
s/^  *//     ——>删除行开始位置有填充的空格s/  */ /g    ——>连续空格的用一个空格替代
s/\.  */.  /g  ——>句点后一个或多个空格的用两个空格替代

  

  2、改变一组文件(Sed 最常使用的)

  编写的脚本,要选择有代表性的几个文档进行测试,但并非通过测试了的脚本对于任何一个文档也都可以达到我们的预想效果,若出现我们不想的或没有出现我们想要的结果,我们还得再修改脚本

  3、提取文件内容

sed -n '/^\.deBL/,/^\.\.$/p' /usr/lib/```     ——>匹配范围以“.deBL”开始到“..”结束

例子:

#!/bin/sh
sed -n '
s/'//g      ——>删除引号
s/\.Se /Chapter /p  ——>替换章标题
s/\.Ah /•A. /p     ——>替换节标题
s/\.Bh /••B. /p    ——>替换子标题
' $*    ——>对命令行上指定的文件起作用

   4、编辑工作转移

  sed作为一个流编辑器,在管理中应用编辑操作,而这些操作永远不会被写入到编辑文档中去

s/^"/‘‘/
s/'$/’’/
s/'? /’’? / g
s/*?$/’’?/g
s/ "/ ‘‘/g
s/* /’’ /g
s/•"/•‘‘/g
s/'•/’’•/g
s/')/’’)/g
s/']/’’]/g
s/("/(‘‘/g
s/\["/\[‘‘/g
s/";/’’;/g
s/":/’’:/g
s/,"/,’’/g
s/",/’’,/g
s/\."/.\\\&’’/g
s/"\./’’.\\\&/g
s/\\(em\\^"/\\(em ‘‘/g
s/\\(em/’’\\(em/g
s/\\(em"/\\(em‘‘/g
s/@DQ@/"/g

  注:第一行命令是找开始处的引号将它替换成左引号,第二行是将最后行的引号替换成右引号,剩下的就是找上下文中的引来并替换成相应的符号,最后一个是允许我们为troff提供真正的引号(")

五、基本Sed命令

   sed的命令集是由25个命令组成,下面介绍主要常用的几个命令

 命令基本格式

[address] command

对于只能接受单个地址行的命令基本格式

[line-address] command

对于命令组,可以用大括号包起来作用于同一个地址

[address] {
        command1
        command2
        command3
}

  注:第一个大括号可以与command1同行,但最后的大括号不能与最近的命令同行,必须得它自己一行

  1、替换——>"s"

 命令格式:

[address] s/pattern/replacement/flags

flags:n/g/p/w,其中n为1-512,表示对文件第n次出现的情况进行替换;g,等同全局变量;p,打印;w file,将模式空间的内容写到文件file中

replacement:比较有特别意义的几个字符,&、\n、\ :分别是用正则表达式匹配的内容替换、匹配第n个子串(n是个数字)、转义字符

  1.1、替换元字符——>"\"、"&"、"\n"

  注:

反斜杠用于转义其他元字符,但它在替换字符串时,也可用于包含换行字符;

与称号用于可变的字符中,这个特别管用也可用于替换整个匹配的内容

一些例子:

sed 's/\(.*\).*:\(.*\)/\2:\1/'  changefile  ——>将行中用冒号分开的两部分交换
s/See section [1-9][0-9]*\.[1-9][0-9]*/(&)/  ——>匹配类似”See section 12.9“或”See section 9.12“

  1.2、校正索引条目

针对文章或书本的索引,我们可以用过滤的方法将其中的章节都提取出来

看懂以下

#!/bin/sh
grep "^\.XX" $* | sort -u |
sed 's/^\.XX \(.*\)$/\/^\\.XX \/s\/\1\/\1\//'

  第一行,用grep获取命令行文本的索引并交给sort排序和删重复,最后给sed进行过滤

  2、删除——>"d"

   如某行匹配这个删除命令的地址,那么就删除整行,而不是只删除匹配的内容(除非你有特别指定或用替换命令来取代删除),当然也可以用于特别指定删除两个地址之间的文件内容,命令格式可参考

/^\.sp/d
/^\.np/d

  3、追加、插入、更改

  使用时,必须指定在多行上,所以在sed中,不太常用!前两个命令只应用于单个地址,不能匹配地址范围,而最后的更改却是可以的

[line-address]a\
text    ——>追加
[line-address]i\ text    ——>插入

[address]c\ text    ——>更改

例子:

/<Larry's address>/i\

14400 cross count\

frech linck,inter

  ——>在匹配”<Larry's address>“的地方插入两行文本

  4、列表——>"l"

  将非打印的字符显示为两个数字的ASCII代码

   在sed中不能用ASCII值匹配字符,当然也不能用八进制数值匹配字符

  5、转换——>“y”

特有的命令,它按位置将字符串中的abc每个字符,都转换成字符串xyz中的等价字符

[address] y/abc/xyz/

  6、打印——>"p"

原文地址:https://www.cnblogs.com/sbaicl/p/2727303.html