linux中的正则表达式

怕会弄混系统符号和正则符号,分开记录在开头

正则符号进行匹配文件内容时是以单个字符进行匹配的,是搜索内容的。
find  命令是搜索文件名的。

容易混乱的地方:
grep -E “^oldboy” 根据文件内容进行单个字符的匹配,但是先决条件就是你搜索的条件–ol
在这里插入图片描述
然后加上-w 后就是还是用单词进行匹配,没有ol的单词所以就没有显示。

系统符号

$  用于取出变量中的内容  用于取出指定列中的信息  命令提示符
! 用于表示取反或排除的意思  表示强制处理
#  表示文件内容注释符号  表示用户命令提示符号
$()==``  表示命令执行结果留下,用于其他命令调用
""  表示输入内容就是输出内容,但是部分信息会被解析
''  表示输入内容就是输出内容,所见即所得
`` 表示执行结果留下,用于其他命令调用

>>  标准输出重定向符号
>    标准输出追加重定向
2>   错误输出重定向
2>>   错误输出追加重定向
..  上级目录
.  这级目录
&&  前一个命令执行成功后执行&&后面的命令
|| 前一件事执行失败了再执行||后面的命令
;不管前面的命令是否成功,都会执行分好后面的命令

正则符号

^  以什么开头
$  以什么结尾
.  匹配一个字符
*  匹配一个或多个字符
\  转义字符
[]  匹配
[^]  排除

+  匹配符号前面一个字符连续出现1次或多次
?  出现0次或1次
{} 指定次数{n,m}最少n次最多m次
|() 汇总一个整体   后项引用前项

正则表达式的概念:

1.正则符号用于匹配字符信息
2.正则符号主要匹配文件内容信息
3.正则符号只有三剑客命令可以识别
4.正则符号用于分析数据

补充:

如何查看一行后面有没有空格
cat  -A  文件信息
vim  :set list

grep  -v  "^$" /etc/selinux/conf  利用v进行取反,排除空行显示

正则去除空行和注释

[root@localhost ~]# grep -Ev  "^$|^#" /etc/hostname 
localhost.localdomain

查看以d结尾的内容

[root@localhost ~]# grep  "d$" /etc/selinux/config
SELINUX=disabled


[root@localhost ~]# 
[root@localhost ~]# 

查看#号开头的信息

[root@localhost ~]# grep "^#" /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
[root@localhost ~]# 

查看一行后面有没有空格

[root@localhost ~]# cat -A  /etc/selinux/config
$
# This file controls the state of SELinux on the system.$
# SELINUX= can take one of these three values:$
#     enforcing - SELinux security policy is enforced.$
#     permissive - SELinux prints warnings instead of enforcing.$
#     disabled - No SELinux policy is loaded.$
SELINUX=disabled$
# SELINUXTYPE= can take one of three two values:$
#     targeted - Targeted processes are protected,$
#     minimum - Modification of targeted policy. Only selected processes are protected. $
#     mls - Multi Level Security protection.$
SELINUXTYPE=targeted $
$
$

方法2:

vim  /etc/selinux/conf
set list

.符号实例

[root@localhost ~]# cat lsy.txt 
gd
god
good
goood
[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# grep ".d" lsy.txt 
gd
god
good
goood
[root@localhost ~]# grep "g.d" lsy.txt 
god
[root@localhost ~]# 
  • 匹配符号前面一个字符,连续出现一次或多次(在三剑客中是正则符号,在find中是通配符)
    o*
[root@localhost ~]# grep "o*" lsy.txt 
gd
god
good
goood

.* 是匹配任意字符

找出m开头m结尾

[root@localhost ~]# cat lsy.txt 

I am oldboy teacher!
I teach linux.

I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.

not 4900000448.
my god ,i am not oldbey,but OLDBOY!

[root@localhost ~]# grep "^m.*m$" lsy.txt 
my blog is http://oldboy.blog.51cto.com
[root@localhost ~]# 

\ 转义字符
将有意义信息变得没有意义
将没有意义的信息变得有意义

[root@localhost ~]# grep ".$" lsy.txt   匹配任意一个字符结尾的信息
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
[root@localhost ~]# grep "\.$" lsy.txt   匹配以.结尾的信息
I teach linux.
my qq num is 49000448.
not 4900000448.
[root@localhost ~]# 

\t --制表符

\n --换行符号

[root@localhost ~]# echo -e  oldboy01\noldboy02
oldboy01noldboy02
[root@localhost ~]# echo -e  "oldboy01\noldboy02" -e是显示高级命令
oldboy01
oldboy02
[root@localhost ~]# 

\r — 类似于换行符,但是不太好用

[]是匹配单个字符

[root@localhost ~]# grep  [ab] lsy.txt   匹配
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my god ,i am not oldbey,but OLDBOY!
[root@localhost ~]# 

找出符号

[root@localhost ~]# grep   "[^0-9A-Za-z]" lsy.txt       [^] 是排除的意思,是匹配单个字符的排除
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
[root@localhost ~]# 

区别:

grep  -v  "[a-z0-9A-Z]"  是排除整行的信息

grep  -E  扩展正则符号
egrep  扩展正则符号
sed  -r  扩展正则符号

区别例子

[root@localhost ~]# grep -v "[0-9]" lsy.txt 

I am oldboy teacher!
I teach linux.

I like badminton ball ,billiard ball and chinese chess!
our site is http://www.etiantian.org

my god ,i am not oldbey,but OLDBOY!
[root@localhost ~]# grep  "[^0-9]" lsy.txt 
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY

[root@localhost ~]# grep “[0-9A-Za-z]” lsy.txt -o 单行匹配输出

扩展正则符号(正则就是单个字符式的进行匹配)
+匹配符号前面一个字符连续出现1次或多次

[root@localhost ~]# grep -E  "o+"  test.txt -o
o
oo
ooo
oooo
ooooo
oooooo

? 匹配符号前面一个字符连续出现0次或1次

[root@localhost ~]# grep -E  "o?"  test.txt 
gd
god
good
goood
gooood
goooood
gooooood
[root@localhost ~]# 

{} 匹配符号前面一个字符连续出现指定的次数
{n,m} 匹配符号前面一个字符连续出现最少出现n次最多出现m 次

[root@localhost ~]# cat test.txt
gd
god
good
goood
gooood
[root@localhost ~]# grep -E  "o{2,3}" test.txt  
good
goood
gooood
[root@localhost ~]# 

{n} 出现指定的n次
[root@localhost ~]# grep -E  "o{2}" test.txt  
good
goood
gooood
[root@localhost ~]# 

{n,} 出现最少n次,最多没有限制

[root@localhost ~]# grep -E  "o{2,}" test.txt  
good
goood
gooood
goooood
gooooood
[root@localhost ~]# grep -E  "o{2,}" test.txt   -o
oo
ooo
oooo
ooooo
oooooo
[root@localhost ~]# 

{,m}出现最少0次,最多出现m次
[root@localhost ~]# grep -E  "o{,4}" test.txt   
gd
god
good
goood
gooood
goooood
gooooood
[root@localhost ~]# grep -E  "o{,4}" test.txt   -o
o
oo
ooo
oooo
oooo
o
oooo
oo
[root@localhost ~]# 

练习,取出正确的身份证号

[root@localhost ~]# cat test03.txt
老男孩  110109197706078765
老女孩  105110111100281236
老狗    oldboy
张三    117237
李四    123123oldboy
王五    123123619230917203710237

[root@localhost ~]# grep -wE "[0-9]{18}" test03.txt 
老男孩  110109197706078765
老女孩  105110111100281236
[root@localhost ~]# 

因为正则是根据单个字符进行取舍的,而grep -w w参数是将单个字符的读取方式改为单词的读取方式。

| 匹配多个字符信息

[root@localhost ~]# grep -vE "^#|^$|#" /etc/selinux/config 
SELINUX=disabled
SELINUXTYPE=targeted
[root@localhost ~]# 

() 1.将多个字符信息汇总成一个整体,也是改变正则符号的单个字符读取的方式,改成单词的读取方式。
2.后项引用前项信息

 [root@localhost ~]# echo 123456| sed -r  's/(.*)/<\1>/g'  
<123456>
[root@localhost ~]# 

取出磁盘利用率

[root@localhost ~]#  df -h |grep  /dev/sda1 |grep -E "[0-9]{,3}%"  -o
25%

说明:正则匹配一行信息时,默认有贪婪特性

如何取出文件权限数值
在这里插入图片描述

取出IP地址

i[root@localhost ~]# ip  a s eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:fc:63:7d brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.200/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fefc:637d/64 scope link 
       valid_lft forever preferred_lft forever
[root@localhost ~]# 

[root@localhost ~]# ip a s eth0 |grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" -o
10.0.0.200
10.0.0.255

讨论的问题
{n,m}里面的m优先级高于n,人话说就是:
先匹配m 再匹配n.,但是这个先后规则是以行为单位进行作用的,如果本行内没有高于m的,则先使用n。
在这里插入图片描述

另外一种说法就是:
始终都是先匹配m ,但是碍于文件内容的显示机制,所以显示出来就是这样的
在这里插入图片描述

[root@localhost ~]# cat aaa.txt 
oo
oooo
oooooooo
ooo

[root@localhost ~]# grep -E "o{2,3}" aaa.txt  
oo
oooo
oooooooo
ooo

截取文件权限信息数值
方法1:

[root@localhost ~]# stat /etc/hosts|sed -n '4p'
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)

[root@localhost ~]# stat /etc/hosts|sed -n '4p'|sed -r 's#^.*\(0(.*)/-.*$#\1#g'
644
s###g 是sed 替换的格式
sed  -r 是sed识别扩展正则的参数
^.* 是任意字符开头的
.*$  是任意字符结尾的
\(0 是遇到(0这个信息就结束前面的任意字符开头
(.*) 是表示任意字符,加上小括号就是为了调用
这也是后面\1的意义
/- 是匹配的信息

方法2:利用命令本身截取

[root@localhost ~]# stat -c %a /etc/hosts
644

获取IP地址

[root@localhost ~]# ip a s eth0|awk 'NR==3'
    inet 10.0.0.200/24 brd 10.0.0.255 scope global eth0
[root@localhost ~]# ip a s eth0|awk 'NR==3'|awk -F "[ /]" '{print $6}'
10.0.0.200
[root@localhost ~]# ip a s eth0|awk 'NR==3'|awk -F "[ /]" '{print $7}'
24
[root@localhost ~]# ip a s eth0|awk 'NR==3'|awk -F "[ /]" '{print $5}'
inet

解释:
第一步:
[root@localhost ~]# ip a s eth0

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:fc:63:7d brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.200/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fefc:637d/64 scope link 
       valid_lft forever preferred_lft forever
[root@localhost ~]# 

第二步:取出第三行

[root@localhost ~]# ip a s eth0|awk 'NR==3'
    inet 10.0.0.200/24 brd 10.0.0.255 scope global eth0

第三步:以空格和/为分割为列

[root@localhost ~]# ip a s eth0|awk 'NR==3'|awk -F "[ /]" '{print $6}'
10.0.0.200
[root@localhost ~]# 


本行开头有四个空格,inet后面有一个空格,也就是第五个空格,因为[ /]的意思是以空格和/为分割为列,所以IP地址是第6列,24是第7列,第5列是inet
在这里插入图片描述

[root@localhost ~]# ip a s eth0|awk 'NR==3'|awk -F "[ /]" '{print $7}'
24
[root@localhost ~]# ip a s eth0|awk 'NR==3'|awk -F "[ /]" '{print $5}'
inet
[root@localhost ~]# 

获取IP地址

[root@localhost ~]# ip a s eth0|awk 'NR==3'
    inet 10.0.0.200/24 brd 10.0.0.255 scope global eth0
[root@localhost ~]# ip a s eth0|awk 'NR==3'|awk -F "[ /]+" '{print $3}'
10.0.0.200
[root@localhost ~]# 


[ /]+的意思是如果以空格为分隔符则多个连续的空格为一个分割
+ 一个或多个

获取IP地址

[root@localhost ~]# ip a s eth0|awk 'NR==3'|awk -F "inet |/24" '{print $2}'
10.0.0.200
[root@localhost ~]# 

获取IP地址

ip a s eth0|awk -F "[ /]+" 'NR==3{print $3}'
awk语法:awk 参数信息 '条件{命令}'

[root@localhost ~]# ip a s eth0|awk -F "[ /]+" 'NR==3{print $3}'
10.0.0.200
[root@localhost ~]# 

获取IP地址

[root@localhost ~]# ip a s eth0|sed -n '3p'
    inet 10.0.0.200/24 brd 10.0.0.255 scope global eth0
[root@localhost ~]# ip a s eth0|sed -n '3p'|sed -n 's#^.*et ##gp'
10.0.0.200/24 brd 10.0.0.255 scope global eth0
[root@localhost ~]# ip a s eth0|sed -n '3p'
    inet 10.0.0.200/24 brd 10.0.0.255 scope global eth0
[root@localhost ~]# ip a s eth0|sed -n '3p'|sed -n 's#^.*et ##gp'
10.0.0.200/24 brd 10.0.0.255 scope global eth0
[root@localhost ~]# ip a s eth0|sed -n '3p'|sed -n 's#^.*et ##gp'|sed -n 's#/24.*eth0$##gp'
10.0.0.200
[root@localhost ~]# 

获取IP地址

[root@localhost ~]# ip a s eth0|sed -n '3p'|sed -nr 's#^.*et (.*)/24.*eth0$#\1#gp'
10.0.0.200
[root@localhost ~]# 


[root@localhost ~]# ip a s eth0|sed -nr '3s#^.*et (.*)/24.*eth0$#\1#gp'
10.0.0.200

获取IP地址

[root@localhost ~]# ip a s eth0|grep "inet "|egrep '([0-9]+\.?){4}' -o
10.0.0.200
10.0.0.255

正则符号与通配符号区别

通配符号:
查找文件名称信息
命令行经常使用
正则符号:
查找文件内容信息
三剑客命令经常使用/各种语言经常使用

关于筛选出来的信息的颜色显示
–color=auto/–color

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值