前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第五章 正则表达式&字符处理

第五章 正则表达式&字符处理

作者头像
晓天
发布2019-07-04 11:27:29
2.1K0
发布2019-07-04 11:27:29
举报

第五章 正则表达式&字符处理

5.1 正则表达式

5.1.1正则表达式概念

正则表达式即是规范字符的书写格式,是使用特殊符号,实现文字、字符格式上的规定。

如:邮箱的书写格式为:XXXX@XXXX.XXX,此格式即为邮箱地址的正则表达式。

5.1.2保留字

Linux中,有很多的特殊符号,可以帮助我们进行正则表达式的制定,具体常用符号如下:

* ---通配符,表示任意长度的任意字符,如:rm -rf /mnt/ff*

? ---单配符,表示一位长度的任意字符

[] ---单个字符的取值范围,如: [0-9] [02468] [a-z] [A-Z]

---[[:digit:]] 表示数字,同 [0-9]

---[[:lower:]]表示小写字母,同 [a-z]

---[[:upper:]]表示大写字母,同 [A-Z]

---[[:alpha:]]表示所有的字母,同[a-zA-Z]

---[[:alnum:]] 表示字母+数字,同[a-zA-Z0-9]

---[[:space:]] 空格,同[ ]

---[[:punct:]] 标点符号

{} ---多字符的取值范围,如{ab,bc,cd}

"" ---主用于明确命令参数的范围,如:date +"20%y-%m-%d%H:%M:%S"

---date命令显示日期时间,+ 表示规定显示的格式

'' ---多用于引号嵌套时使用,如:echo 'i say :"hello"'

`` ---反单引,所引起来的内容,先当做命令执行,再把执行结果交给其他命令使用。如:echo "the time is :`date`"

$ --- 变量值提取功能 用户身份标识符

\ --- 转义字符,提取后边符号的引申含义, 如:PS1="[\u@\h \W]\\$"

| --- 管道符,格式:前后两个命令,前命令的结果交给后命令当做输入信息使用。如:ll /etc | less

& --- 后台执行符, 在命令后面加上&后,该命令将被放入到后台执行

如:find / -name f1 &

jobs ---查看后台进程

&& --- 命令连接、顺序执行,如:echo aaaaa && echo bbbbb ,

要求:必须每个命令都正确执行

|| --- 多个命令连接,前命令执行失败,才会去执行后命令,

如: cat f1 || echo bbbbb

> --- 输出重定向,格式:前命令,后文档,功能:把前命令的运行结果,当做文字保存到文档中。如:ls -l /var > /mnt/f1

> 覆盖,活用: > f1 ---清空文档内容 >> 追加

< --- 输入重定向,格式:前命令,后文档,功能:把后文档的文字内容,当做前命令的输入信息使用,如:write zhang < /mnt/f1 mail zhang < /mnt/f1

关于以上各符号的案例中使用的命令,下面来做一下分析、介绍:

与运算符 &&

功能:两个条件必须都满足,结果才是成立的

如:A 与 B 到校上课

来 来 = 成立

来 没来 = 不成立

没来 来 = 不成立

没来 没来 = 不成立

分析:当A条件满足时,B条件才有审查的必要;但是当A条件不满足时,无论B条件是否满足,结果都是不成立的,则B条件就不会被审核了。所以,对应 cat f1 && echo bbb,若f1文件不存在,cat命令执行失败,则后面echo bbb的命令将不再执行。

或运算 ||

功能:两个条件至少一个是满足的,结果就是成立的

例:A 或 B 到校上课

来 来 = 成立

来 没来 = 成立

没来 来 = 成立

没来 没来 = 不成立

分析:当A条件满足时,无论B条件是否满足,结果都是成立的,则B条件

就不会被审核了。只有当A条件不满足时,B条件才有审查的必要。

所以,对应 cat f1 && echo bbb,若f1文件不存在,cat命令

执行失败,则后面echo bbb的命令才会执行。若cat f1执行成功,

则后面的echo bbb将不再执行。

write命令

功能:给当前已登录用户发送即时消息

write zhang tty2 ---给指定终端上的已登录用户,发送消息

---回车后,进入消息编辑状态,ctrl+d组合键停止编辑,并发送

wall命令

功能:给当前所有已登录用户发送广播消息

wall ---回车后,进入消编辑状态,ctrl+d组合键停止编辑,并发

mail命令

功能:给系统中存在的用户发送邮件。Linux支持系统内用户的邮件发

送。

mail zhang ---给本机用户发送邮件

---回车后,subject:设置邮件主题,回车,编辑邮件内容,

ctrl+d组合键,停止编辑并发送

mail ---查看本人邮箱,进入后,会看到各个邮件,是有编号的,

输入编号,查看指定邮件,输入 r 回复邮件 q 退出邮

箱。

5.2 字符处理

Linux中对于文档中文字、字符的处理也有很多细节操作的命令,具体如下:

1)head、tail命令

head -n 3 f1 ---显示文档的前3行

head -n -3 f1 ---排除文档的最后3行,显示前面的文字

tail -n 3 f1 ---显示文档的最后3行

tail -n +3 f1 ---从第3行开始显示到结尾

对于head –n -3 和tail –n +3 的行数控制,其原理是文档中每行文字的读取都借助与文档内部的行指针操作,指针指向哪一行,就会读取哪一行。但是当文件读取前,指针是指向第一行之前的空处,所以只有指针下移一行,才会读取到第一行的文字,因此tail –n +3 实质是让指针下移三次,开始读取,所以才会读取到第三行的文字;而head–n -3是避除指针可到的最后三行,所以是不读取倒数第三行的。

命令组合应用:tail -n +3 f1 | head -n 3 ---显示3-5行

2)grep抓取命令

grep命令可以从文档中抓取显示包含指定字符的行,在日常使用中比较常用。

grep "name" f1 ---抓取f1中包含name的行

grep -n "name" f1 --- -n表示结果中显示行号

grep -i "name" f1 --- -i 表示忽略大小写

grep -v "name" f1 --- -v 显示不包含指定字符的行

grep "^name" f1 --- "^name" 以指定字符开头的行

grep "name$" f1 --- "name$" 以指定字符结尾的行

活用:grep "^name$" f1 ---抓取显示一行仅有name字符的行

grep -n "^$" f1 ---抓取显示空行及其行号

ll /etc | grep "^d" | less ---显示/etc/所有目录。

注: ll后目录文件的第一个字符显示为d

3)wc统计命令

wc命令是对文档文字做统计功能的,最常用的是行数上的统计。

wc -l f1 --- -l 统计文档中有几行文字

其他参数: -c 字节数 -m 字符数 -w单词数 -L 最长行的长度

活用:ll /etc | grep "^d" | wc -l ---统计/etc/下目录的个数

注:ll后一个文件显示为一行,所以统计行数即为统计目录数

4)sort 排序显示

sort命令用于对显示内容的排序处理。

sort -rn -k 2 f2 ---按照文档的第二列的数值大小,降序(即大->

小)排序显示,-r 降序,不写默认升序 -n

按照数值大小比较排序 -k 指定按照第几列

排序

sort -rn -u -k 2 f2 --- -u表示去除重复行

sort -t ":" -rn -k 2 f2 --- -t 指定列之间的分隔符,不写,默

认空格作为分隔符

5)cut命令

cut命令,截取指定列显示

cut -d " " -f 3 f1 ---截取文档中的第3列, -d 指定分隔符

-f 指定显示第几列

但是,cut命令对分隔符连续较多的情况,审核较为死板,很难按照我们想要的效果实现截取,如有以下文件:

aaa 111 AAA

bbb 222 BBB

则每行文字中各列间的空格数不同,在用cut时,是用第一个空格作为分隔符,第二个空格则被视为第二列,一次类推,因此,在截取指定列时十分不便。所以一般在连续分隔符个数不统一时,我们更习惯使用awk命令。

6)awk命令

awk命令功能十分强大,可根据需要抓取、截取指定的列或行。具体如下:

awk -F" " '{print $2,$3}' f1 ---截取显示文档的第2、第3列,-F 指

定分隔符, $2,$3表示显示第几列

awk -F" " '($2>300){print $2,$3}' f1

--- 第二列的值大于300的行,显示其第2、第3列,()中指定筛选条件

awk 'NR==4 || NR==3' f1 ---显示第3和第4行, NR表示行号

awk '/data/ {print $2}' f1 ---抓取包含指定字符的行,再进行截取列

awk '$4 ~ /data/ ' f1 ---抓取第4列包含指定字符的行

awk '$4 !~ /data/ ' f1 ---抓取第4列不包含指定字符的行

7)sed命令

sed命令是一个十分复杂的文字处理命令,其中有很多的参数和格式,但可以实现几乎所有的字符处理需求,常用的几个参数如下

sed '1,3d' f1 ---不显示第1-第3行, 1,$可表示1-文件尾

sed '/data/d' f1 ---不显示包含指定字符的行

sed 's/data/hello/p' f1 ---查找文档中的指定字符,替换成新字符

sed 's/data/&123/g' f1 ---查找文档中的指定字符,在其后追加字符

sed -n '/data/p' f1 ---显示包含指定字符的行

具体sed的其他命令和参数可见下面几个表格:

命令

功能

a\

在当前行后面加入一行或者文本

b

label 分支到脚本中带有标号的地方,如果标号不存在就分支到脚本的末尾

c\

用新文本改变或者替代本行的文本

d

从模式空间中制删除指定行

D

删除模式空间中第一行

i\

在当前行上面插入文本

h

拷贝模式空间到内存缓冲区

H

追加模式空间内容到内存缓冲区

g

获得内存缓冲区的内容,并替代当前模式空间中的文本

G

获得内存缓冲区的内容,并追加当前模式空间中的文本

命令

功能

l

列表不能打印所指定的字符清单

n

读取下一个输入行,用下一个命令处理新的行

N

追加下一个输入行到模式空间后面并在二者之间嵌入一个新的行,改变当前行的号码

p

打印模式空间的行

P

打印模式空间的第一行

q

退出sed

r file

从file中读取行

t label

if分支,从最后一行开始开始,一旦满足要求,将直接到带有标号的命令出,或者到脚本的末尾

T label

错误分支,从最后一行开始开始,一旦满足要求,将直接到带有标号的命令出,或者到脚本的末尾

命令

功能

w file

写并追加到模块空间file末尾

W file

写并追加到模块空间的第一行到file末尾

!

表示后面的命令对所有没有被选定的行发生作用

s/re/string/

用string替换正则表达式re

=

打印当前行号码

#command

把注释扩展到下一个换行符以前

替换标记

g

行内全面替换

p

打印行

w

把行写入一个文件

命令

功能

替换标记(二)

x

互换模块空间的文本和缓冲区的文本

y

把一个字符翻译为另外的字符(此替换标记不可用正则表达式)

选项

-e command

允许多点编辑

--expression=command

同上

-h,--help & --version

帮助 & 查看sed 版本 (2个选项)

-n,--quiet,--silent

取消默认输出

-f script-file

引导sed脚本文件名

--file=script-file

同上

Sed匹配符号

元字符

功能

例子

匹配

^

指定行的开始

/^linux/

所有以linux开头的行

$

指定行的末尾

/linux$/

所有以linux结束的行

.

匹配一个非换行符的字符

/l…x/

匹配所有包含l后面3个字符任意,最后为x的行

*

匹配零或多个字符

/*linux/

匹配所有模板是一个或多个空格后紧跟linux的行

[]

匹配一个指定范围内的字符

[Ll]inux

匹配包含Linux或linux的行

[^]

匹配一个不再指定范围内的字符

/[^a-egz]tp/

匹配不再指定a-e及g-z区域内的开头并紧跟tp的字段

元字符

功能

例子

匹配

&

保存所搜字符用来替换其他字符

s/linux/**&**/

&表示搜索字符串,因此linux将变为**linux**

/<

指定单词的开始

/\<linux/

匹配包含linux开头的单词的行

/>

指定单词的结束

/linux\>/

匹配包含以linux结尾的单词的行

x\{m\}

重复字符X,M多少次

/o\{5\}/

匹配包含5个o的行

x\{m,\}

重复字符X,至少M次

/o\{5,\}\

匹配至少5个o的行

由上表可见,sed的功能十分繁复,所以我们初学可以暂时不必记忆那么多的格式,只需要先掌握咱们案例中最常用的几项参数设置就好。

5.3 vi编辑器的使用

之前我们已经初步介绍过vi编辑器的使用,其实Linux中还有一个命令与vi类似,就是vim,它们二者的区别是:vi 无颜色编辑;vim 有颜色编辑。

vi共有三种工作模式,如下图:

关于三种工作模式的切换,可以总结如下:

vi f1=>命令模式(查看状态)=>按 i a o 键,进入插入模式(编辑状态) =>按ESC键,返回命令模式=>按: 键,进入末行模式。

进入编辑状态的 i 键,是在当前光标处开始插入;a键是在光标下一个字符处开始插入;o键是在光标下一行处开始插入。

另外,在vi的末行模式下还有很多实用的命令可以帮助我们快速编辑文档:

:wq ---保存退出

:q! ---不保存退出

:set nu ---显示行号

:set nonu ---不显示行号

:/linux ---查找指定字符,n键查找下一个

:1,6d ---删除1-6行, 10,$d 表示从第10行到结尾

:10-20 s/linux/hello/p ---10-20行中,所有linux单词替换成hello

%s/linux/hello/p %表示全文替换

:100 ---跳转到第100行的位置

:setbackup ---在进行编辑前,自动的做文件备份,备份到与原

文件同目录下,文件名中加~

在命令模式下,也有很多的快捷键可以帮助我们快捷操作:

ZZ ---保存退出

ZQ ---不保存退出

G ---跳转到文件结尾

u ---撤销操作

yy ---复制光标所在行

3yy ---复制3行,光标所在行开始的三行

p ---粘贴到光标的下一行

dd ---剪切一行,即光标所在行

3dd ---剪切3行,光标所在行开始的三行

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 教主小筑 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档