Linux基础知识系统学习.NO25——正则表达式、字符截取方法与命令

11.5.正则表达式

11.5.1.正则表达式方法

11.5.1.1.表达式概念

正则表达式是用于描述字符排列和匹配模式的一种语法规则,它主要是用于字符串的模式分割、匹配、查找以及替换工作。主要就做模糊匹配工作。

11.5.1.2. 元字符

通配符是完全匹配,主要用于匹配文件名的,ls,find,cp这些命令就只支持通配符而不支持正则表达式;正则表达式是包含匹配,主要用于匹配文件中的数据的grep,awk,sed命令都可以支持正则表达式。

11.5.1.3. 基础正则表达式

在这里插入图片描述
星 号:比如命令grep “a*”+文件名,结果并不是输出a开头的行,一定要和通配符区分开,这个命令结果会打印出文件内所有内容,因为匹配对象是前的字符出现0次或多次的那一行,那么即使这一行没有a,但是0次也算,所以任然会打印出来,所以会出现所有内容。
所以如果是想找包含有a字符的行就应该命令grep “aa
” +文件名,这样的结果,至少每行有一个a.所以包含匹配原则上就是写的匹配行越长,精度越高,匹配行越短,精度越低,如a就没有意义,会打印出整篇文件。
.号:匹配除了换行符以外的任意一个字符,点的作用和通配符中的?很接近,也是任意字符,而且限定有且仅有一个字符,比如a…d,那么就会得到文件中所有包含axxd的字符串。如果和
搭配使用,如a.d,那么就会匹配所有包含axxxxxd的字符串。并不需要以a开头,只需要字符串中包含这两个字符并a在d前面就可以了。
^和$ :^是行首匹配grep “^a”+文件名,就可以匹配出所有以a开头的行;$ 是行尾匹配,此时字符要写在前面,如grep “bbb $ ”+文件名,就能得到所有bbb结尾的行。而这两个连用,如grep “^$”+文件名会直接匹配空白行。
[ ]符:这个中括号和通配符中的中括号是一样的用法,不过结果有点区别,比如“[0-9]”就会列出所有含有数字的行,因为是模糊匹配,比如grep “ ^ [ 0-9]”就能找到文件中所有以数字开头的行。在中括号以外 ^ 表示行首,在中括号内^表示取反。如” [ ^A-Za-z ] ”就是匹配没有字母的行。
\ 转义符:用来取消特殊符号的功能,使其成为一个普通符号,比如“*&”意思就是找以
结尾的行,这个*就只是一个符号,而不是元字符了。*匹配任意多的字符,?匹配一个字符0次或1次,+匹配一个字符至少出现一次。
{n}:表示这个符号前面的字符必须刚好出现了n次的行,如“a{3}”就会匹配a字母连续出现三次的字符串。
{n,}:表示这个符号前面的字符必须至少出现了n次的行,但实际上这个符号和{n}的结果基本一致,因为至少出现n次的包含了刚好出现n次的行,所以得到得结果基本是一样的。
{n,m}:表示这个符号前面的字符至少出现n次,最多出现m次的行,但是实际上即使一个字符出现次数超过了m,也会被找出来,因为超过m次的行包含了出现n-m次的行,正则表达式是包含匹配。
这三个看起来好像都差不多其实是单独使用时差不多,需要看出差别还要在前后写上限定符,也就是写上更多的条件来限定字符。
单词匹配,精准查询,如grep /filename 即可得到文件中所有包含root的行,如果是敲在命令行中,则需要使用转义符将书名号声明为普通字符,即grep <root> /etc/bash

11.5.1.4.正则表达式案例

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地址

11.5.2.字符截取命令

11.5.2.1.cut命令

grep命令是根据关键字和选项来截取特定的行,cut命令则是截取特定的列。
cut+[选项]+文件名,从文件中显示出选定的字节、字符或字段。cut -b+[数字]+文件名,提取该文件中每行的第几个字节,cut -c+[数字]+文件名,提取该文件中每行的第几个字符,
cut -f +数字+文件名,提出文件中的指定列,默认分隔符是制表符(\t)cut -f 1,5 -d+[分界符],可以按照分界符找到文件中第一个列和第5列,分界符是按照具体文本内容来确定的,比如a,b,c,d,e这样的分界符就可以定为逗号,如果是空格分界符号就要写成‘ ’,也就是按照文件内容确定的分界符来得到指定的列的内容。比如使用命令:
grep “/bin/bash” /etc/passwd|grep -v “root”|cut -f 1 -d ":"就可以在passwd文件中截取登录bash为/bin/bash的用户名,同时把root排除在外。

11.5.2.2.printf命令

格式化输出命令,功能用法和C语言中的printf一样,不一样的是输出类型符号不同,输出字符串的符号是%ns,n是数字(一般省略),表示输出几个字符,整数的符号是%ni,n是数字(一般省略),表示输出几个整数,输出浮点数的符号是%m.nf,m(一般省略)是数字,表示输出一共有几位(不包括小数点),n也是数字(控制小数位数),表示输出的浮点数有几位小数。输出格式支持部分转义符如\a,\b,\f(清屏),\r,\n,\t,\v.printf输出格式为printf+“输出类型”(单引号也可以)+输出内容
如printf ‘%s’ 1 2 3 4 5输出结果是12345,不会读取空格。
读取一个4列的表格文件pirntf ‘%s\t%s\t%s\t%s\n’ $(cat 文件名)。
printf是标准的格式化输出,所有的格式化比如回车换行都需要手动输入,还有print命令,和printf的区别就是在输出末尾会自动多输出一个回车换行,不需要手动输入换行。

11.5.2.3.awk命令

命令格式为awk ‘条件1{动作1}条件2{动作2}…’ +文件名,如果条件1满足就执行条件1,如果条件2满足,就执行动作2,以此类推,如果没有条件只有动作,就表示无条件执行。
条件一般是关系表达式比如X>=10,动作一般是格式化输出或流程控制语句。
对于一个表格文档(用制表符排好的文档), 使用命令:
awk ‘{printf $2 “\t” $4 “\n”}’+文件名,就可以输出文件的第2列和第四列,awk会首先将文件名赋值为$0,然后进入文件读行,按照分隔符读行,每一个字段赋一个值,从$1,$2依次向后赋值。使用awk的时候,里面的转义符号要用双引号括起来。实际上awk会智能寻找不同列的分隔符,不管是空格还是其他什么,都是要找到字符串才算一个字段,这才是awk强于cut的地方。
命令df -h|grep “/dev/sda2”|awk ‘{print $5}’|cut -d “%” -f 1,就可以截取出df -h命令后,/dev/sda2磁盘信息的第五列,也就是使用占比情况的百分比,同时去除百分号。
命令cat /etc/passwd|grep “/bin/bash”|awk ‘BEGIN{FS=”:”}{print $1 }’,该命令就可以直接截取passwd中登录shell为/bin/bash的用户的用户名。BEGIN是一个条件,指在命令运行一开始执行后面的动作,FS=’:’是指将默认分隔符改为冒号。总之要指定分隔符的时候,一定要先用BEGIN,不然先截取完了再BEGIN就晚了。
命令cat test.txt |grep -v name|awk '$4>=70{print $2}'作用于文件;
在这里插入图片描述
结果就是zhang 和 liu.

11.5.2.4.sed命令

字符替换命令,将文本中的字符串替换成需要的内容。sed一般执行过程会打印出该文件所有内容,并且直接操作完成后只是临时修改,没有写入文件。
命令格式为sed+[选项] ‘范围+[动作]’+文件名,-n只会把进过sed命令处理的行输出到屏幕,-e允许输入多个动作,-i将sed修改过的行修改到文件内,直接修改文件本身。不写范围就默认全文。
支持的动作有:a(追加),c(整行替换),i(当前行的前行插入),d(删除),p(打印)
s(字串替换):,格式为“行范围s/旧字串/新字串/g”。
如sed -n ‘2p’ test.txt,就会只打印出文档的第二行。
sed ‘2,4d’ test.txt,就会删除第2到4行,不过并没有删除文本中的内容。要加选项i才可以。
sed ‘2a cheng ji bu hao’ test.txt,就会在第二行后面追加这句话。把a换成i就是在第二行上面插入这个字符串。
sed ‘2c cheng ji bu hao’ test.txt,就会将第二行变成这句话。
sed ‘3s/50/80/g’ test.txt,就会将第三行的数值50改成80.s前不加范围,那么范围就是全文。
加入选项-i就会写入文本,而且不会出现在屏幕上。
sed -e ‘动作1;动作2…’+文件名就可以执行多个动作。

11.5.2.5.按位置截去指定字符

除了使用以上的截取工具进行字符截取之外,还可以根据字符所处在字符串中的位置进行字符截取。如,变量:
var=http://www.baidu.com/baiduzhidao.html
echo ${var#//},#表示从左往右删除,表示删除任意字符,//表示删除到第一个//的时候停止,同时也将这个//一起删除,所以结果是:
www.baidu.com/baiduzhidao.html
echo ${var##
/},##表示删除,和单#不同的是,双#会一直删除到最后一个/才会停下,同时删除这个/,所以结果是:baiduzhidao.html
echo ${var%/
},%表示从右往左删,所以就应该换到停止字符的右边去,和单#类似,单%只会从右往左找到第一个/就会停下,同时删除这个/,所以结果是:
http://www.baidu.com
echo ${var%%/
},%%表示删除,和单%不同的是双%将会一直删除到从右往左的最后一个/,所以得到的结果是http:
echo ${var:start:len},从第start+1个字符截取,一共截取len个字符,start最小从0开始,表示第一个字符,如echo ${var:0:5},结果是:
http: 如果从start一直要截取到整个变量结束,那么第三个参数可以省略不写,如echo ${var:7} 得到:
www.baidu.com/baiduzhidao.html注意从0开始,所以填7,表示从第八个字符开始保留。
echo ${var:0-start:len},开始的位置也可以从右往左数,从右边第start个字符开始截取,截取长度为len,需要注意的是,从右往左的时候,start是几,就从第几个开始,不需要加1.如echo ${var:0-5}得到的结果就是.html,最后一个len也可以省略,直接截取到最后。

ps:再次强调,如果出现问题,认真检查空格问题

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值