第一部分、正则表达式
1、什么是正则表达式
正则表达式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊符号的辅助,可以让用户轻易的达到查找、删除、替换某特定字符串的处理程序。
正则表达式基本上是一种“表示法”,只要工具程序支持这种表示法,那么该程序就可以用来作为正则表达式的字符串处理之用。例如vi、grep、awk、sed等工具,因为他们有支持正则表达式,所以这些工具就可以使用正则表达式的特殊字符来进行字符串的处理。但例如cp、ls等命令并未支持正则表达式,所以就只能使用bash自身的通配符。
最后应该注意的是,正则表达式和通配符是完全不一样的东西,因为通配符是代表的bash接口的一个功能,但是正则表达式是一种字符串处理的表示方式。
2、正则表达式的分类
REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能
程序支持: grep, vim, less,nginx等
分两类:
基本正则表达式: BRE
扩展正则表达式: EREgrep -E, egrep
正则表达式引擎:采用不同算法,检查处理正则表达式的软件模块PCRE( Perl Compatible Regular Expressions)
元字符分类:字符匹配、匹配次数、位置锚定、分组
man 7 regex
3、基本正则表达式的元字符
a、字符匹配:
.:匹配任意单个字符
[]:匹配指定范围的任意单个字符
[^]:匹配指定范围外的任意单个字符
b、匹配次数:用在要指定其出现的次数的字符的后面,用于限制其前面字符出现的次数,默认工作于贪婪模式,最大匹配。
c、位置锚定
^:行首锚定,用于模式的最左侧
$:行尾锚定,用于模式的最右侧
^PATTERN$:用于PATTERN来匹配整行
^$:空白行
^[[:space:]]*$:空白行或包含空白字符的行
单词位置的锚定,非特殊字符组成的连续字符(字符串)都称为单词。
\<或者\b:词首锚定,用于单词模式的左侧
\>或者\b:词尾锚定,用于单词模式的右侧
\<PATTERN\>:匹配整个单词
d、分组及引用:
分组: \(\):将一个或多个字符捆绑在一起,当作一个整体进行处理,如: \(root\)\+
分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部变量中,这些变量为:
\1:模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配的字符
\2:模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配的字符
4、第一大文本处理工具-grep
grep: Global search REgular expression and Print out the line.
作用:文本搜索工具,根据用户指定的“模式”对目标文
本逐行进行匹配检查;打印匹配到的行;
模式:由正则表达式字符及文本字符所编写的过滤条件
grep [OPTIONS] PATTERN [FILE…]
grep root /etc/passwd
grep "$USER" /etc/passwd
grep '$USER' /etc/passwd
grep `whoami` /etc/passwd
–color=auto: 对匹配到的文本着色显示;
-v: 显示不能够被pattern匹配到的行;
-i: 忽略字符大小写
-n: 显示匹配的行号
-c: 统计匹配的行数
-o: 仅显示匹配到的字符串;
-q: 静默模式,不输出任何信息
-A #: after, 后#行
-B #: before, 前#行 -C #: context, 前后各#行
-e:实现多个选项间的逻辑or关系
grep –e ‘cat ’ -e ‘dog’ file
-w:整行匹配整个单词
-E:使用ERE
5、grep练习
例题一、查找特定字符串
a、使用-n选项表示找到包含特定字符串,并显示其位于第几行
b、使用-v选项表示找到不包含特定字符串,-n显示其位于第几行
c、使用-i选项表示找到包含特定字符串不分大小写,-n并显示其位于第几行
例题二、利用中括号[]来查找集合字符
a、如果我们想查找test或者taste这两个单词时,可以发现他们有共同的tst的存在。这个时候我们可以这样做,其实[]里面不论有几个字符,他只能代表一个字符。
b、如果我们不想要oo字符前面的g字符的化,我们可以使用集合字符的反向选择[^]来完成,注意[^]只是代表匹配到的一个字符。
c、查找oo字符前面不是小写字母
d、查找0-9的任意单个字符(工作贪婪模式,最大匹配,因此有下面的3183字符的匹配)
e、 我们也可以使用[[:lower:]]和[[:digit:]]来替代上面c和d题的表示方法
例题三、行首和行尾的字符锚定^$
a、锚定行首是某个指定的字符,例如以the开头的行,或者以小写字母开头的行
b、锚定行首不是字母开头的行
c、锚定行尾以点号结尾的行(注意点号在正则表达式代表任意单个字符,所以此处需要转义)
d、使用行首和行尾可以锚定空白行^$
例题四、任意一个字符.与重复字符*
a、点号代表匹配到任意的一个字符,而*代表前面的字符出现多次或者0次
b、匹配g开头或者g结尾的,或者同时g开头g结尾的字符串(开头的g可有可无,也可以多次)
c、.*两个匹配g与g之间有多个字符
例题五、限定前面的字符出现的次数范围{}
a、匹配前面的字符出现两次(最大匹配)
b、找到goooooogle字符串的行(至少3个o滤除两个o的)
例题六、使用分组\(\),和\1两个结合取出两个oo之间有其他字符的行
\1:此变量表示从第一个左括号匹配到的模式
以上为grep的基本练习,具体详细的练习见本期博客的作业部分。
第二部分、文本处理工具
一、文件内容查阅工具
cat:由第一行开始显示文件内容
tac:由最后一行开始显示,可以看出tac是cat的倒写形式
rev:与cat类似,是cat的水平倒写的形式
more:一页一页的显示文件的内容
less:与more类似,但是比more好的是,它可以往前翻页
head:只看头几行
tail:只看结尾的几行
1、文件查看命令:cat,tac,rev
cat [OPTION]… [FILE]…
-E: 显示行结束符$
-n: 对显示出的每一行进行编号
-A:显示所有控制符
-b: 非空行编号
-s:压缩连续的空行成一行
tac命令为cat命令相反的方向显示,而rev为cat显示内容每一行的相反显示,换句话说tac是cat垂直取反,而rev是cat水平取反。
2、分页查看文件内容命令:more,less
more: 分页查看文件
more [OPTIONS…] FILE…
-d: 显示翻页及退出提示
v less:一页一页地查看文件或STDIN输出
查看时有用的命令包括:
/文本 搜索 文本
n/N 跳到下一个 或 上一个匹配
less 命令是man命令使用的分页器
3、显示文本前后几行的内容:head、tail
head [OPTION]… [FILE]…
-c #: 指定获取前#字节
-n #: 指定获取前#行
– #: 指定行数
tail [OPTION]… [FILE]…
c #: 指定获取后#字节
-n #: 指定获取后#行
-f: 跟踪显示文件新追加的内容,常用日志监控
二、抽取文本的工具cut和合并文件工具paste
cut [OPTION]… [FILE]…
-d DELIMITER: 指明分隔符,默认tab
-f FILEDS:
#: 第#个字段
#,#[,#]:离散的多个字段,例如1,3,6
#-#:连续的多个字段, 例如1-6
混合使用: 1-3,7
-c 按字符切割
–output-delimiter=STRING指定输出分隔符
显示文件或STDIN数据的指定列
cut -d: -f1 /etc/passwd
cat /etc/passwd | cut -d: -f7
cut -c2-5 /usr/share/dict/words
paste 合并两个文件同行号的列到一行
paste [OPTION]… [FILE]…
-d 分隔符:指定分隔符,默认用TAB
-s : 所有行合成一行显示
paste f1 f2
paste -s f1 f2
三、分析文本的工具
文本数据统计: wc
整理文本: sort和uniq
比较文件: diff和patch
计数单词总数、行总数、字节总数和字符总数,可以对文件或STDIN中的数据运行
$ wc story.txt
39 237 1901 story.txt
行数 字数 字符数
使用 -l 来只计数行数
使用 -w 来只计数单词总数
使用 -c 来只计数字节总数
使用 -m 来只计数字符总数
把整理过的文本显示在STDOUT,不改变原始文件
$ sort [options] file(s)
常用选项
-r 执行反方向(由上至下)整理
-n 执行按数字大小整理
-f 选项忽略( fold)字符串中的字符大小写
-u 选项(独特, unique)删除输出中的重复行
-t c 选项使用c做为字段界定符
-k X 选项按照使用c字符分隔的X列来整理能够使用多次
uniq命令:从输入中删除重复的前后相接的行
uniq [OPTION]… [FILE]…
-c: 显示每行重复出现的次数
-d: 仅显示重复过的行
-u: 仅显示不曾重复的行
连续且完全相同方为重复
常和sort 命令一起配合使用:先排序后计数sort userlist.txt | uniq -c
比较两个文件之间的区别
$ diff foo.conf-broken foo.conf-works
< use_widgets = no
—
> use_widgets = yes
注明第5行有区别(改变)
diff 命令的输出被保存在一种叫做“补丁”的文件中使用 -u 选项来输出“统一的( unified)” diff格式文
件,最适用于补丁文件。
patch 命令复制在其它文件中进行的改变(要谨慎使用!)
适用 -b 选项来自动备份改变了的文件
diff -u foo.conf-broken foo.conf-works > foo.patch
patch -b foo.conf-broken foo.patch
以上部分文本处理工具相关命令的练习,见本期博客的练习题部分
原创文章,作者:AndyIvanXue,如若转载,请注明出处:http://www.178linux.com/30956