怕会弄混系统符号和正则符号,分开记录在开头
正则符号进行匹配文件内容时是以单个字符进行匹配的,是搜索内容的。
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