通配符-特殊符号-正则表达式

1.1 正则表达式:通配符知识回顾

通配符------用来匹配 查找文件 文件名

找出/oldboy 以 .txt结尾的文件

find /oldboy –type f –name “*.txt”

1.2 正则表达式:通配符和特殊符号讲解

它是shell的内置功能。

通配符(wildcard),用过DOS的应该很了解

通配符是用来匹配/查找文件名。

Linux命令基本都支持通配符:

通配符详解

测试文件的创建:

[root@oldboyedu-39 ~]# mkdir /oldboy/20170118 -p
[root@oldboyedu-39 ~]# cd /oldboy/20170118/
[root@oldboyedu-39 20170118]# touch stu{00..10}.txt oldboy{00.10}.log
[root@oldboyedu-39 20170118]# #找出当前目录下 文件名是以stu开头的
[root@oldboyedu-39 20170118]# find -type f -name "stu*" 
./stu05.txt
./stu00.txt
./stu01.txt
./stu02.txt
./stu07.txt
./stu04.txt
./stu10.txt
./stu03.txt
./stu09.txt
./stu06.txt
./stu08.txt
[root@oldboyedu-39 20170118]# find -type f -name "*.txt" 
./stu05.txt
./stu00.txt
./stu01.txt
./stu02.txt
./stu07.txt
./stu04.txt
./stu10.txt
./stu03.txt
./stu09.txt
./stu06.txt
./stu08.txt
[root@oldboyedu-39 20170118]# ls stu*
stu00.txt  stu02.txt  stu04.txt  stu06.txt  stu08.txt  stu10.txt
stu01.txt  stu03.txt  stu05.txt  stu07.txt  stu09.txt
[root@oldboyedu-39 20170118]# find -type f -name "stu*.txt"
./stu05.txt
./stu00.txt
./stu01.txt
./stu02.txt
./stu07.txt
./stu04.txt
./stu10.txt
./stu03.txt
./stu09.txt
./stu06.txt
./stu08.txt
[root@oldboyedu-39 20170118]#  ###找出当前目录下文件名中包含(只要有就行)oldboy的文件 ----模糊查找
[root@oldboyedu-39 20170118]# find -type f -name "*oldboy*"
./oldboy07.log
./oldboy09.log
./oldboy08.log
./oldboy03.log
./oldboy02.log
./oldboy10.log
./oldboy06.log
./oldboy04.log
./oldboy01.log
./oldboy05.log
./oldboy00.log

*所有 通配符符号-----查找文件

以stu开头的文件

以.txt结尾的文件

文件中包含oldboy

生成序列: {}

[root@oldboyedu-39 20170118]# echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
[root@oldboyedu-39 20170118]# echo {1..9}
1 2 3 4 5 6 7 8 9
[root@oldboyedu-39 20170118]# #生成stu1---stu10
[root@oldboyedu-39 20170118]# echo stu{1..10}
stu1 stu2 stu3 stu4 stu5 stu6 stu7 stu8 stu9 stu10
[root@oldboyedu-39 20170118]# echo stu{1..10}.txt
stu1.txt stu2.txt stu3.txt stu4.txt stu5.txt stu6.txt stu7.txt stu8.txt stu9.txt stu10.txt
[root@oldboyedu-39 20170118]# echo stu{1..10}{a..z}
stu1a stu1b stu1c stu1d stu1e stu1f stu1g stu1h stu1i ...

备份:

[root@oldboyedu-39 20170118]# ###生成无规律的
[root@oldboyedu-39 20170118]# echo {1,5,100}
1 5 100
[root@oldboyedu-39 20170118]# echo {1..5}
1 2 3 4 5
[root@oldboyedu-39 20170118]# echo {1,2,3,4,5}
1 2 3 4 5
[root@oldboyedu-39 20170118]# echo A{B,C}
AB AC
[root@oldboyedu-39 20170118]# echo A{,C}
A AC
[root@oldboyedu-39 20170118]# echo oldboy.txt{,.bak}
oldboy.txt oldboy.txt.bak
[root@oldboyedu-39 20170118]# cp oldboy
oldboy00.log  oldboy02.log  oldboy04.log  oldboy06.log  oldboy08.log  oldboy10.log
oldboy01.log  oldboy03.log  oldboy05.log  oldboy07.log  oldboy09.log  
[root@oldboyedu-39 20170118]# cp oldboy01.log {,.bak}

等差创建

[root@oldboyedu-39 20170118]# echo {1..10}
1 2 3 4 5 6 7 8 9 10
[root@oldboyedu-39 20170118]# echo {1..10..2}
1 3 5 7 9
[root@oldboyedu-39 20170118]# echo {a..z..2}
a c e g i k m o q s u w y

1.3 正则表达式:通配符合特殊符号讲解

&& 并且,前一个命令执行成功之后在执行后面的命令重启某一块网卡的时候
>> 标准输出,追加重定向,把内容追加到文件的最后一行
> 重定向 危险 先把文件的内容清空 把内容追到文件的最后一行
/ 根/etc/hosts 路径分隔符号
$LANG 取出变量里面的内容.
. 当前目录
.. 上一级目录
家目录
| 管道(或者)[正则表达式egrep]
# 注释

1.4 常用通配符及单引号,双引号,不加引号的区别

单引号-所见即所得。

[root@oldbouedu-39 20170118]# echo '$LANG $(which mkdir) {a..z}'

$LANG $(which mkdir) {a..z}

双引号-解析特殊符号,特殊符号有了原本的特殊意思

[root@oldbouedu-39 20170118]# echo "$LANG $(which mkdir) {a..z}"

en_US.UTF-8 /bin/mkdir {a..z}

不加引号-和双引号类似,但是支持通佩服符

[root@oldbouedu-39 20170118]# echo $LANG $(which mkdir) {a..z}

en_US.UTF-8 /bin/mkdir a b c d e f g h i j k l m n o p q r s t u v w x y z

1.5 基础正则表达式

  1. 使用简单的符号 ^ $ . * + ......表示字母 文本

  2. 省事 提高我们效率

    egrep "oldboy[0-9]+" oldboy.txt

综合:

①正则表达式就是为了出来大量的文字,文本,字符串而定义一套规则和方法.
②通过定义的这些特殊符号的辅助,系统管理员就可以快速过滤,替换或输出需要的字符串.
③Linux正则表达式一般以行为单位处理的.
简单说:
⊙为处理大量文本,字符串而定义的一套规则和方法
⊙以行为单位出来,一次处理一行
###正则表达式是一种描述一组字符串的模式,类似数学表达式,通过各种操作符组成更小的表达式.正则表达式-regular expression

正则表达式与通配符的区别

通配符是用来找文件,Linux下面大部分命令都可以用 ls *.txt  rm *.txt  cp *.txt /tmp 
正则表达式 用了找文本 文字 (文件内容)   常用的地方linux grep sed awk

正则不表达式使用注意事项:

1.正则表达式是按照行来处理的
2.grep/egrep使用高亮带颜色
cat >>/etc/profile<<EOF
alias egerp='egrep --color=auto'
alias grep='grep --color=auto'
EOF
[root@oldboyedu-39 ~]# source /etc/profile

基础正则表达式:

^ 	$ 	. 	* 	[] 	[^]

扩展正则表达式:

+  |	?	{} ()

基本正则表达式:(查找man grep 查找REGULAR)

创建测试环境:
cat>>oldboy.txt<<EOF
I am oldboy teacher!
I teach linux.


I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com

my  QQ num is 49000448.

not 4900000448.
my god,i am not oldboy,but OLDBOY!
EOF

以^什么的开头:

[root@oldbouedu-39 ~]# grep "^m" oldboy.txt 
my blog is http://oldboy.blog.51cto.com
my  QQ num is 49000448.
my god,i am not oldboy,but OLDBOY!
[root@oldbouedu-39 ~]# grep -n "^m" oldboy.txt 
6:my blog is http://oldboy.blog.51cto.com
8:my  QQ num is 49000448.
11:my god,i am not oldboy,but OLDBOY!
[root@oldbouedu-39 ~]# \grep -n "^m" oldboy.txt 
6:my blog is http://oldboy.blog.51cto.com
8:my  QQ num is 49000448.
11:my god,i am not oldboy,but OLDBOY!
[root@oldbouedu-39 ~]# \grep -n "^m" oldboy.txt 
6:my blog is http://oldboy.blog.51cto.com
8:my  QQ num is 49000448.
11:my god,i am not oldboy,but OLDBOY!
[root@oldbouedu-39 ~]# grep -n "^m" oldboy.txt 
6:my blog is http://oldboy.blog.51cto.com
8:my  QQ num is 49000448.
11:my god,i am not oldboy,but OLDBOY!

以什么的结尾$

[root@oldbouedu-39 ~]# cat -A oldboy.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$
$
my  QQ num is 49000448.$
$
not 4900000448.$
my god,i am not oldboy,but OLDBOY!$
[root@oldbouedu-39 ~]# grep -n "m$" oldboy.txt 
6:my blog is http://oldboy.blog.51cto.com

空行 这一行:

[root@oldbouedu-39 ~]# grep "^$" oldboy.txt 




[root@oldbouedu-39 ~]# grep -n "^$" oldboy.txt 
3:
4:
7:
9:
[root@oldbouedu-39 ~]# cat -An oldboy.txt 
     1	I am oldboy teacher!$
     2	I teach linux.$
     3	$
     4	$
     5	I like badminton ball ,billiard ball and chinese chess!$
     6	my blog is http://oldboy.blog.51cto.com$
     7	$
     8	my  QQ num is 49000448.$
     9	$
    10	not 4900000448.$
    11	my god,i am not oldboy,but OLDBOY!$

以.(点)为开头的任意字符:

[root@oldbouedu-39 ~]# grep "." oldboy.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
my  QQ num is 49000448.
not 4900000448.
my god,i am not oldboy,but OLDBOY!
[root@oldbouedu-39 ~]# grep -o "." oldboy.txt

特殊字符的转意用法:

[root@oldbouedu-39 ~]# grep "\.$" oldboy.txt 
I teach linux.
my  QQ num is 49000448.
not 4900000448.

1.6 扩展正则表达式:

[root@oldbouedu-39 ~]# grep -n "^m.*m$" oldboy.txt 
6:my blog is http://oldboy.blog.51cto.com

1.7 扩展正则表达式2

[abc]	[0-9]	[\.,/]

匹配字符集合内的任意一个字符a或b或c;

[root@oldbouedu-39 ~]# grep "[abc]" oldboy.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
my god,i am not oldboy,but OLDBOY!
[root@oldbouedu-39 ~]# grep "[a-z]" oldboy.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
my  QQ num is 49000448.
not 4900000448.
my god,i am not oldboy,but OLDBOY!
[root@oldbouedu-39 ~]# grep "[A-Z]" oldboy.txt 
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my  QQ num is 49000448.
my god,i am not oldboy,but OLDBOY!
[root@oldbouedu-39 ~]# grep "[0-9]" oldboy.txt 
my blog is http://oldboy.blog.51cto.com
my  QQ num is 49000448.
not 4900000448.

以不是mn 开头的行

[root@oldbouedu-39 ~]# grep "^[mn]" oldboy.txt 
my blog is http://oldboy.blog.51cto.com
my  QQ num is 49000448.
not 4900000448.
my god,i am not oldboy,but OLDBOY!
[root@oldbouedu-39 ~]# grep "^[^mn]" oldboy.txt 
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!

1.8 扩展正则表达式ERE

特殊字符 含义与例子
+ 重复前一个字符一次货一次以上
前面一个字符连续出现一个或多个,可以取出连续的前一个字符。[a-z]
[root@oldbouedu-39 data]# cat >>a.txt<<EOF

good
gd
goood
[root@oldbouedu-39 data]# grep -E "go+d" a.txt
good
goood
[root@oldbouedu-39 oldboy]# grep "0+" oldboy.txt
[root@oldbouedu-39 oldboy]# grep "0" oldboy.txt
my QQ num is 49000448.
not 4900000448.
[root@oldbouedu-39 oldboy]# grep -o "0" oldboy.txt
0
0
0
0
0
0
0
0
[root@oldbouedu-39 oldboy]# grep -E "0+" oldboy.txt
my QQ num is 49000448.
not 4900000448.
[root@oldbouedu-39 oldboy]# grep -oE "0+" oldboy.txt
000
00000
[root@oldbouedu-39 oldboy]# egrep "0+" oldboy.txt
my QQ num is 49000448.
not 4900000448.
[root@oldbouedu-39 oldboy]# egrep -o "0+" oldboy
[root@oldbouedu-39 oldboy]# egrep -o "0+" oldboy.txt
000
00000 |
| | | 表示或者 同时过滤多个字符
[root@oldbouedu-39 oldboy]#
[root@oldbouedu-39 oldboy]# grep -E "3306|1521" /etc/services
mysql 3306/tcp # MySQL
mysql 3306/udp # MySQL
ncube-lm 1521/tcp # nCube License Manager
ncube-lm 1521/udp # nCube License Manager
[root@oldbouedu-39 oldboy]# grep -E "3306|1521|873" /etc/services
rsync 873/tcp # rsync

rsync 873/udp # rsync
mysql 3306/tcp # MySQL
mysql 3306/udp # MySQL
ncube-lm 1521/tcp # nCube License Manager
ncube-lm 1521/udp # nCube License Manager
fjmpjps 1873/tcp # Fjmpjps
fjmpjps 1873/udp # Fjmpjps
fagordnc 3873/tcp # fagordnc
fagordnc 3873/udp # fagordnc
dtp-net 8732/udp # DASGIP Net Services
ibus 8733/tcp # iBus
ibus 8733/udp # iBus
dxspider 8873/tcp # dxspider linking protocol
dxspider 8873/udp # dxspider linking protocol |
| () | 反向引用
[root@oldboyedu-39 ~]# cat >a.log<<EOF

good

glad
gd
god
goood
EOF
[root@oldboyedu-39 ~]# egrep "g(oo|la)d" a.log
good

glad |
| {} | a{n,m}前面一个字符连续出现至少n次,最多出现m次 |
| ? | |

1.9 元字符

​ 元字符是一种Perl风格的正则表达式,只有一部分文本处理工具支持它,并不是所有的文本处理工具都支持。

[root@oldbouedu-39 oldboy]# grep "\boldboy\b" q.txt 
oldboy      oldboy

练习题:取IP地址方法:

sed方法:

[root@oldbouedu-39 oldboy]# ifconfig eth0|sed -n '2p'|sed 's#^.*dr:##g'|sed 's# B.*$##g'
10.0.0.200

sed -r 反向引用:

[root@oldbouedu-39 oldboy]# ifconfig eth0|sed -n '2p'|sed -r 's#^.*addr:(.*)Bc.*#\1#g'
10.0.0.200

sed + 正则表达式的应用:

[root@oldbouedu-39 oldboy]# stat /etc/hosts|sed -n '4p'|sed -r 's#^.*ss: \((.*)\/-rw.*$#\1#g'
0644
[root@oldbouedu-39 ~]# stat /etc/hosts|awk 'NR==4'|sed -r 's#^.*s: \(0(.*)/-rw.*$#\1#g'
644

awk方法一:

[root@oldbouedu-39 oldboy]# ifconfig eth0|awk -F "[ :]+" 'NR==2{print $4}'
10.0.0.200

awk 方法二:

[root@oldbouedu-39 oldboy]# stat /etc/hosts|awk -F "[ ]+" 'NR==4{print $2}'
(0644/-rw-r--r--)
[root@oldbouedu-39 oldboy]# stat /etc/hosts|awk -F "[ (]+" 'NR==4{print $2}'
0644/-rw-r--r--)
[root@oldbouedu-39 oldboy]# stat /etc/hosts|awk -F "[ (/]+" 'NR==4{print $2}'
0644

每日一题转发

posted @ 2019-09-26 14:52  Kalimdor  阅读(1178)  评论(0)    收藏  举报