您的位置:首页 > 运维架构 > Linux

linux正则表达式入门及文件操作命令进阶

2016-02-25 15:44 288 查看
         今天我们简单的总结一下正则表达式,linux系统下的正则表达式和其他语言下的正则表达式有一点小的区别,不过初学者就不用考虑那么多了,基本上在linux下的正则表达式的使用方法在其他地方一样的适用。

说来说去那么什么是正则表达式呢?

正则表达式就是用于字符串的模式分隔、匹配、查找以及替换操作,其重点在于匹配(即模糊匹配)

和正则表达式相像的有一个东西叫做通配符,通配符又是什么呢?

通配符其实和正则表达式的定义差不多,都是用于字符串的匹配,那么两个有什么区别呢?

通配符:用于文件名的匹配,完全匹配(即必须一模一样),对于文件操作的命令可以使用

正则表达式:用于匹配文件中的数据,包含匹配(包含匹配字符串即可以匹配成功),对于文件内容操作的命令可以使用分为:基础正则表达式和扩展正则表达式

简单的通配符介绍:

*:表示匹配任意内容

?:表示匹配任意一个内容

[]:表示匹配括号内任意一个字符

由于正则表达式太多过于复杂,这里先简单的总结基础正则表达式,扩展的正则表达式以后再予以总结:

*:前一个字符匹重复0次,或者任意多次(单独使用没有任何作用)                  例如:"aa*"  会匹配到以一个a开头的所有内容

.:匹配除了换行符意外的任意一个字符               例如:"a..b"  会匹配到所有的以a开头,b结尾,字符数为4的所有内容   "a.*b"  匹配以a开头,b结尾的所有行  ".*"  匹配所有行

^:匹配行首    例如:"^a"  匹配以a开头的所有行

$:匹配行尾    例如:"a$"  匹配以a结尾的所有行     "^$"  匹配空白行(利用-n参数显示行数)

[]:匹配括号内任意一个字符  

例1:"a[cde]b"   匹配a开头,b结尾,中间字符为cde其中任意一个字符的内容                           例2:   "^[ab]"     匹配以a或者b开头的所有行

[^]:匹配除括号内字符意外的任意一个字符                 例如:"^[^a-z]"   匹配以非a-z开头的行

\:转义符                   例如:"\.$"  匹配以.结尾的行,而不是以任意字符结尾的行

\{n\}:匹配前一个字符恰好出现n次(第一个\表示转义)    例如:"a\{\3}"   匹配a正好出现3次的行(注意:如果a连续出现3次以上,也会出现)

\{n,\}:匹配前一个字符不少于n次   例如:"a\{3,\}"   匹配a出现3次以上的行

\{n,m\}:匹配前一个字符出现n到m次    例如:"a\{1,3\}"   匹配a出现1次到3次的行
注意:最后3个正则表达式必须要有定界符来匹配才有用,不然没有什么区别

正则表达式举例:

1、[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}                   用于匹配日期,格式为"YYYY-MM-DD"

2、[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}               用于匹配IP地址,格式为"255.255.255.255"  只是简单匹配,完全匹配一个IP是无法实现的

刚刚介绍完了正则表达式,各位读者肯定在想什么地方可以用得上呢?

都说了正则表达式是用于匹配的,那么肯定和文件内容操作的命令密不可分了,一般来说配合grep,cut,sort,awk,sed等命令,加上管道符,正则表达式就可以大放异彩

grep,cut和sort命令我们已经在前面的章节介绍过了,这里就不做介绍了

我们直接进入awk命令,但是在此之前我们先要介绍一个输出命令,printf

printf命令:格式化输出命令(最古老的输出,echo是进化版) (之后的print命令可以实现自动换行,比printf好用,建议使用print来代替printf)

格式: printf   '输出类型 输出格式'  【内容】

输出类型:

%ns:输出字符串,n代表n个字符(一般可以不加n)

%ni:输出整数

%m.nf:输出浮点数               例如:%8.2f      一共8位数,其中2位是小数

输出格式:

\a:输出警告音

\n:换行

\t:Tab键

\r:回车

\b:输出退格键

例如:printf  %s 1 2 3 4    输出为1234
注:其实这个命令没有什么特别需要掌握和了解的,一般感觉也用不上,用上了再man一下看看就行了,只需要知道用于打印就行了

接下来就是我们的正主了,awk命令,其实awk和cut有很多相似的地方,都是内容截取命令,都是竖行截取,但是awk比cut强大太多了

这里我们只说一下简单的一些使用方法

awk命令:内容截取命令(默认以Tab键(或者空格)作为分隔符,cut命令是无法以空格作为分隔符的)

格式:awk  '条件1{动作1}条件2{动作2}....' 【文件名】     (这个条件和动作可以写很多很多,并没有限制)

条件:一般为条件表达式
动作:一般为输出,也可以为流程控制语句(初学者不需要掌握)

说那么多没有什么用,直接来几个例子吧

例1:df -h | awk '{print $1 "\t" $3}'           截取df命令查看后的第一和第三列

例2:df -h | awk 'BEGIN{print "abc:"}{print $1 "\t" $3}'         先输出“abc:”,之后再输出df查看的第一和第三列(如果是输入的END则是在最后输出)

例3:awk  'BEGIN{FS=":"}{print $1 "\t" $3}'           以":"作为分隔符取出第一和第二列  (通过这个例子,可以知道awk可以完美兼容cut,只是比较复杂)

例4:awk  '$3>=60{print $2}'         如果第三列的数字大于等于60则输出其第二列

sed命令:替换命令(无需打开文件,直接对文件内容就可以进行修改)

格式:

sed  【选项】 '动作'  【文件名】
常用选项:

-n:只输出改变了的行(默认输出全部文件)

-e:允许执行多条动作,用;隔开
-i:对文件直接操作(默认是显示在终端,但是不对文件进行操作,注意使用!!!)

常用动作:

a:追加

c:行替换

s:字符替换  格式:"行范围s/旧字符串/新字符串/g"(和vim中相似)

i:插入

p:打印

d:删除

和awk命令一样,直接来几个例子吧

例1:sed -n '2p' 【文件名】         打印文件中第二行

例2:sed '2,4d' 【文件名】           删除第二行到第四行后打印文件(没有-i参数所以源文件不改变)

例3:sed '2a abc' 【文件名】          在第二行后面加入abc(即在第三行)

例4:sed '2i abc' 【文件名】             在第二行前面加入abc(即在第二行,原来的第二行变为了第三行)

例5:sed '2s/70/100/g' 【文件名】           将第二行的“70”替换为“100”
例6:sed -e 's/70/100/g;s/80/110/g' 【文件名】          将全文中的“70”换为“100”,“80”换为“110”

注:sed命令也是一个强大和常用的文件内容操作命令,需要经常使用来熟练它

这部分就到此为止了,希望可以对各位读者有所帮助
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  正则表达式 linux