2017-12-9Linux基础知识(16)文本处理工具

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2017-12-9Linux基础知识(16)文本处理工具相关的知识,希望对你有一定的参考价值。

??我们简述一下上一章的内容,主要讲的是bash编程的基础,介绍了其编程类型,以及介绍了编程语言的类型什么是过程式编程和对象式编程,然后我们编写了第一个脚本程序以及如何运行的方式有那些,之后又讲了一些bash的配置文件,分别是profile类和bashrc类,前者为登录式shell所提供,而后者是非登录式shell所提供,之后对于shell的书写格式我们也了解到了如何进行编辑以及格式的说明,那么在这一章中,我们来讲述Linux的文本处理工具。

一、Linux文本处理三剑客

??在Linux中的文本处理三剑客功能很强的主要就是grep、sed和awk;grep是一个文本过滤工具,以模式(pattern)的方式进行过滤,那么sed是一个流式编辑器,所以它也是一个文本的编辑工具。而awk在Linux上实现为gawk,那么它是一个文本报告生成器,它能够格式化文本,以非常美观的方式输出的工具。
??那么以上三个工具都会用到一个为正则表达式,那么正则表达式就是由一类特殊字符及文本字符所编写的模式,在这个表达式里其中有些字符不表示其原来有的字面意义,而是用于表示控制或通配的功能,而正则表达式一共分为两类,一种是基本正则表达式,另一种为扩展正则表达式,这两者的区别就在于它们的元字符有所不同,而元字符的功能就是用于匹配和控制的功能,我们来总结一下:

???正则表达式:REGEXP
?????由一类特殊字符及文本字符所编写的模式,其中有些字符不表示其原有的字面意义,而是用于表示控制或通配的功能;
????????分两类:
????????????基本正则表达式:BRE
????????????扩展正则表达式:ERE
????????
????????元字符:用于匹配和控制功能;

二、grep工具

??在这一个章节中,我们在文本处理三剑客当中主要讲的是grep工具,按行来进行搜索,逐行匹配,然后用户指定其模式来进行匹配,如果某一行能被该模式所能匹配到,就在标准输出中显示匹配到的行。而模式就是由正则表达式的元字符及文本字符所编写的过滤条件。不过这些正则表达式要想被识别的话,在该命令中就会正则表达式引擎来所识别正则表达式,无论是grep和sed以及awk,都是有不同的正则表达式引擎,所以元字符就是根据支持正则表达式的引擎而不同。

??好的,现在我们来介绍一下grep命令,其命令格式如下:

???grep?[OPTIONS]?PATTERN?[FILE...]
???grep?[OPTIONS]?[-e?PATTERN?|?-f?FILE]?[FILE...]
???作用:文本搜索工具,根据用户指定的"模式(过滤条件)"对目标文本逐行进行匹配检查;打印匹配到的行;
???模式:由正则表达式的元字符及文本字符所编写出的过滤条件;

??例如,我们在/etc/passwd文件中找出匹配到user1相关用户的行;

???#?grep?"user1"?/etc/passwd
???user1:x:1004:1004::/home/user1:/bin/bash

??这个是最基本的用法,那个引号可以不加,因为毕竟是字符串,之所以这样是因为在CentOS 7都定义了其别名,换句话说,这不是原来的grep命令,而是别名的grep,需要注意的是,CentOS 6是没有的,Debian也是没有的。
??那么grep支持那些常见的选项如下:

???--color=auto:对匹配到的文本着色后高亮显示;
???-i,?--ignore-case:忽略字符的大小写;
???-o,?--only-matching:仅匹配到字符串本身;
???-v,?--invert-match:显示不能被模式匹配到的行;
???-E,?--extended-regexp:支持使用扩展的正则表达式元字符;
???-q,?--quiet,?--silent:静默模式,即不输出任何信息;

???-A?NUM,?--after-context=NUM:后#行;
???-B?NUM,?--before-context=NUM:前#行;
???-C?NUM,?-NUM,?--context=NUM:前后各#行;

??以上就是grep的选项,那么在下面说一下基本正则表达式的元字符。
??基本正则表达式的元字符分为以下几类进行匹配,分别是字符匹配、次数匹配、位置锚定和分组及引用,我们现在来一一列举。

???基本正则表达式元字符:
??????字符匹配:
?????????.:匹配任意单个字符;
?????????[]:匹配制定范围内的任意单个字符;
?????????[^]:匹配指定范围外的任意单个字符;
????????????[:digit:],?[:lower:],?[:upper:],?[:alpha:],?[:alnum:],?[:punct:],?[:space:]
	
??????匹配次数:用在要指定其出现的次数的字符后面,用于限制其前面字符出现的次数;默认工作贪婪模式;
?????????*:匹配前面的字符任意次;0,1,多次;
?????????.*:匹配任意长度的任意字符;
?????????\?:匹配其前面的字符0次或1次;即前面的字符是可有可无的;
		?\+:匹配其面前的字符1次或多次;即前面的字符至少要出现一次;
		?\{m\}:匹配其前面的字符m次(精确匹配);
		?\{m,n\}:匹配其前面的字符至少m次,至多n次;
		????\{0,n\}:至多n次;
		????\{m,\}:至少m次;
??????位置锚定:
?????????^:行首锚定,用于模式的最左侧;
?????????$:行尾锚定,用于模式的最右侧;
?????????^PATTERN:用PATTERN来匹配整行;
????????????^$:空白行;
????????????^[[:space:]]*$:空行或包含空白字符的行;

??我们不仅仅在行的位置上来进行锚定,也能在单词的位置上来进行锚定,那么什么是单词,以及匹配的基本正则表达式的元字符是什么,我们以下用来介绍:

???单词:非特殊字符组成的连续字符(字符串)都称之为单词;

???\<?或?\b:词首锚定,用于单词模式的左侧;
???\>?或?\b:词尾锚定,用于单词模式的右侧;
???\<PATTERN\>:匹配完整单词;

??好的,我们了解了上述的正则表达式以后,有以下的练习题可以参考以下:
??1、显示/etc/passwd文件中不以/bin/bash结尾的行;

 ? # grep -v "/bin/bash$" /etc/passwd

??2、找出/etc/passwd文件中的两位或三位数;

 ? # grep "[[:digit:]]\{2,3\}" /etc/passwd

??3、找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中,以至少一个空白字符开头,且后面非空白字符的行;

 ? # grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg 

??4、找出"netstat -tan"命令中的结果以LISTEN后跟0、1或多个空白字符结尾的行;

 ? # netstat -tan | grep "LISTEN[[:space:]]*$"

??接下来开始说分组及引用,简单来讲是将一个或多个字符捆绑在一起,当作一个整体,而不是匹配单个字符,所以x和y要想一起匹配的话,就用括号给括起来,需要注意的是,括号在是由特殊用途,所以要转义,转义之后为:()。
??那么分组完之后其实是可以引用的,引用就是将分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部变量中,那么这些变量分别为:

???\1:要从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符;(引用第一个模式所匹配到的内容)
???\2:要从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
???\3:要从左侧起,第三个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
???...

??我们来做一下实例:

???He?likes?his?lover.
???He?loves?his?lover.
???She?likes?her?liker.
???She?lovers?her?liker.

???#?grep?"\(l..e\).*\1"?lover.txt

??而这就是后向引用,后向引用就是引用前面的分组括号中的模式,所匹配到的字符;需要注意的是:如果没有分组的必要,但是有引用必要的话,也得加上括号,否则你不知道要引用那一段之间的内容。而用括号括起来不引用的话也只是为了做分组,所以括起来保存的结果是可以不引用的。


以上是关于2017-12-9Linux基础知识(16)文本处理工具的主要内容,如果未能解决你的问题,请参考以下文章

UNICODE编码UTF-16 中的Endian(FE FF) 和 Little Endian(FF FE)

python基础篇16-面向对象初级

C++基础之宏

16 位音频的 fftw :: 峰值在 2f 处出现错误

HTML5:如何在任何文本输入处按 ENTER 后提交表单?

Angularjs 指令在 textarea 插入符号处插入文本