上节课回顾-命令补充回顾
ls -li与ls -lhi的区别
ls -lrt
特殊符号
通配符
简单理解为键盘上除了字母和数字之外的特殊符号,称为通配符
* 匹配任意文本/字符串,例:*.txt 、*.log等
{} 用于生成序列。花括号里面以逗号分隔,且不能有空格
$ 取变量的值
·· (Esc键下边)反引号
| 管道
; 用于分隔,比如:ls -l ;pwd (前面执行失败,后面依然执行)
&& 用于分隔,比如:ls -l && pwd(前面执行成功,才会执行后面的命令)
* (星号示例)
ls -l *.log *.txt 查找后缀为log和txt的文件
ls -l stu* 查找以stu开头的文件
cat stu* 查看stu开头文件的内容
ls -l stu*.txt 查看stu开头并且以txt结尾
{} (花括号示例)
[root@oldboy202 20170118]# echo {1..5}
1 2 3 4 5
[root@oldboy202 20170118]# echo {5..1}
5 4 3 2 1
[root@oldboy202 20170118]# echo {1..5} {a..z}
1 2 3 4 5 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@oldboy202 20170118]# echo A{B,C,D}
AB AC AD
[root@oldboy202 20170118]# echo 2{2,3,4}
22 23 24
[root@oldboy202 20170118]# echo {1,3,5}
1 3 5
echo stu{0..5} 工作中常用
示例:创建 stu01.txt 到stu05.txt
[root@oldboy202 ~]# touch stu{01..5}.txt
[root@oldboy202 ~]# ls stu*.txt
stu01.txt stu02.txt stu03.txt stu04.txt stu05.txt
使用花括号进行备份
公式: echo A{B,C} 意思是结果粘在一起
AB AC
echo A{,C}
A AC
备份
cp oldboy.txt{,.bak}
这条命令就等于执行 cp oldboy.txt oldboy.txt.bak
单引号、双引号与不加引号区别
单引号:吃啥吐啥
[root@oldboy202 ~]# echo '$(which mkdir) {a..z}'
$(which mkdir) {a..z}
双引号:不支持通配符
[root@oldboy202 ~]# echo "$(which mkdir) {a..z}"
/bin/mkdir {a..z}
不加引号:
[root@oldboy202 ~]# echo $(which mkdir) {a..z}
/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
基本正则表达式
为处理大量文本/字符串而定义的一套规则和方法,以行为单位处理
正则表达式- regular expression(RE)
正则表达式与通配符区别:
正则表达式是在文件中查找内容,而通配符一般是查找匹配文件
查找内容的时候,匹配的内容显示颜色
grep --color=auto 3306 /etc/services
正则别名定义 - 准备-环境
alias egrep='egrep --color=auto'
alias grep='grep --color=auto'
cat >>/etc/profile<<EOF
alias egrep='egrep --color=auto'
alias grep='grep --color=auto'
EOF
source /etc/profile
正则表达式分为2种
1 基本正则表达式(BRE,basic regular expression)
2 高级功能:扩展正则表达式(ERE,extended regular expression)
基本正则表达式-环境准备
cat 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
our site is http://www.etiantian.org
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
基本正则表达式
^ 尖角号 找以什么开头的行
示例:grep "^my" oldboy.txt //查找以my开头的行
$ 找以什么结尾的行
示例: grep "m$" oldboy.txt
^$ 表示找空行,这一行什么都没有(不是空格)
示例: grep -n "^$" oldboy.txt
3:
8:
注:-n 参数意思是添加行号
PS:cat -A oldboy.txt 查看文件空行,空格以$显示
. (点) 这个正则表达式,一次可以找到任意1个字符
PS: grep -o “.” oldboy.txt 显示grep 1次找到了什么内容
通常与 grep -o “.*” oldboy.txt 一般这么使用,查看找到的所有内容
示例1:如果我忘了中间是什么字符,如何匹配查找?
[root@oldboy202 ~]# grep "oldb.y" oldboy.txt
I am oldboy teacher!
my blog is http://oldboy.blog.51cto.com
my god ,i am not oldbey,but OLDBOY!
示例2:查找以小数点 “.” 结尾的行
[root@oldboy202 ~]# grep "\.$" oldboy.txt
I teach linux.
my qq num is 49000448.
not 4900000448.
因为.在三剑客有特殊含义,所以需要转义,需要用到\
\ 撬棍,转义使用
示例3:查找以“//” 开头的行
[root@oldboy202 ~]# egrep "\/\/" oldboy.txt
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
0* 表示数字0连续出现了0次或多次
0* 另外一个意思表示连续出现0次的时候,什么都没有,代表空
示例:grep “0*” oldboy.txt 等同于 grep “” oldboy.txt
0* 表示连续出现多次的时候,就会把 000 00000都取出来。
grep -o "0*" oldboy.txt //查看grep如何去查找连续
000
00000
正则表达式的连续是指从0作为起始,1次以上(含1次)即视为多次
.* 匹配文本*前面任意字符的所有内容
示例1:
grep -on ".*" oldboy.txt
示例2:
grep "^.*o" oldboy.txt 查找以任1个字符开头且包含o的行
表示连续或重复的时候,正则会匹配的更多
示例:
[root@oldboy202 ~]# grep -no "^.*e" oldboy.txt
1:I am oldboy teache
2:I te
4:I like badminton ball ,billiard ball and chinese che
6:our site is http://www.e
10:my god ,i am not oldbe
[root@oldboy202 ~]# grep "^.*e" oldboy.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@oldboy202 ~]# egrep ".*g.*$" oldboy.txt
my blog is http://oldboy.blog.51cto.com
our sigte is http://www.etiantian.org
my god ,i am not oldbey,but OLDBOY!
^.* 从头匹配所有,直到指定字符结束
示例:
[root@oldboy202 ~]# grep "^.*b" oldboy.txt
I am oldboy teacher!
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
my god ,i am not oldbey,but OLDBOY!
[abc] 匹配字符集合,正则将其视为一个整体,匹配A或匹配B或匹配C
[A-Z]匹配大小写字母
[a-z]
[0-9]匹配数字
示例:
grep "[b]" oldboy.txt
grep -no "[abc]" oldboy.txt
grep "[A-Z]" oldboy.txt
grep "[1-9a-zA-Z]" oldboy.txt
示例:
找以大写字母开头的行
grep "^[A-Z]" oldboy.txt
找以小写字母结尾的行
grep "[a-z]$" oldboy.txt
练习:
找以m或n或o开头的 并且以m或g结尾的行?
方法1:
[root@oldboy202 ~]# grep "^[mno]" oldboy.txt |grep "[mg]$"
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
方法2:
[root@oldboy202 ~]# grep "^[mno].*[mg]$" oldboy.txt
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
[^abc] 匹配不包含^后面的字符,其他字符都要
grep "[^abc]" oldboy.txt
练习:找出除了m或n开头的行
[root@oldboy202 ~]# grep "^[^mn]" oldboy.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.etiantian.org
扩展1: 查找模糊字符串
[root@oldboy202 ~]# grep "old.*y" oldboy.txt
I am oldboy teacher!
my blog is http://oldboy.blog.51cto.com
my god ,i am not oldbey,but OLDBOY!
扩展2:grep -v 与[^abc]区别
grep -v 排除掉某行
[^abc] 排除掉a或b或c
示例:grep -v "[mn]" oldboy.txt
扩展正则表达式
命令:egrep 或grep -E
+(加号) 前一个字符连续出现了1个或多个
注:正则里面加号1次就认为是多次
示例:
[root@oldboy202 ~]# egrep "0+" oldboy.txt
my qq num is 49000448.
not 4900000448.
查看egrep是如何查找的?
[root@oldboy202 ~]# egrep -o "0+" oldboy.txt
000
00000
示例:查找连续小写字母取出来(注:取的是连续的字符)
[root@oldboy202 ~]# egrep "[a-z]+" oldboy.txt
I am oldboy teacher!
I teach linux.
| 管道在正则里面意思是“或者”
示例1:egrep "3306|1521" /etc/services
示例2:找出my或者oldboy取出来
[root@oldboy202 ~]# egrep "my|oldboy" oldboy.txt
I am oldboy teacher!
my blog is http://oldboy.blog.51cto.com
示例3:找出dumpe2fs /dev/sda1结果中的inode size和inode count
dumpe2fs /dev/sda1 |egrep -i "inode size|innode count"
() 小括号,正则里面表示一个整体
示例1:取出oldboy和oldbey
[root@oldboy202 ~]# egrep "oldb(o|e)y" oldboy.txt
I am oldboy teacher!
my blog is http://oldboy.blog.51cto.com
my god ,i am not oldbey,but OLDBOY!
示例2:找出good和glad
[root@oldboy202 ~]# egrep "g(oo|la)d" a.log
good
glad
? 问号,重复前面的字符0次或1次
示例:
[root@oldboy202 ~]# egrep "go?d" a.log
gd
god
a{n,m} 重复前面的字符n到m次
a{n,} 重复前面最少n次
a{,m} 重复前面最多n次
示例1:
[root@oldboy202 ~]# egrep -o "0{1,3}" oldboy.txt
000
000
00
示例2:
[root@oldboy202 ~]# egrep "0{3,4}" oldboy.txt
my qq num is 49000448.
not 4900000448.
查看其匹配工作情况
[root@oldboy202 ~]# egrep -o "0{3,4}" oldboy.txt
000
0000
egrep 和 sed -r 支持扩展正则
awk直接支持扩展正则
转义字符(了解)
\b
\n
测试题
利用sed取出eth0的IP地址?
第一步:定位
第二步:取内容
ifconfig eth0|sed -n '2p'
ifconfig eth0 |grep "inet addr"
正则方法1(掐头去尾法):
取IP地址
[root@oldboy202 ~]# ifconfig eth0|sed -n '2p' |sed 's#^.*addr:##g'|sed 's#Bc.*$##g'
10.0.0.202
取出Bcast地址
[root@oldboy202 ~]# ifconfig eth0|sed -n '2p' |sed 's#^.*ast:##g' |sed 's#Mask.*$##g'
10.0.0.255
正则方法2
取IP
[root@oldboy202 ~]# ifconfig eth0 |sed -n '2p' |sed -r 's#^.*dr:|Bc.*$##g'
10.0.0.202
取Bcast地址
[root@oldboy202 ~]# ifconfig eth0|sed -n '2p' |sed -r 's#^.*ast:|Mask.*$##g'
10.0.0.255
注:sed -r 使用扩展正则
| 表示或者
正则方法3
反向引用-预备知识:保留谁就括谁
[root@oldboy202 ~]# echo 123456 |sed -r 's#..(..)..#\1#g'
34
[root@oldboyedu37-nb 20170118]# echo 123456|sed -r 's#.(.).(.)..#\1 \2#g'
2 4
[root@oldboyedu37-nb 20170118]# echo 123456|sed -r 's#.(.).(.)..#\2 \1 \2 \2 \2 #g'
4 2 4 4 4
[root@oldboy202 ~]# echo 123456|sed -r 's#.(...).#\1#g'
2346
注:
1.前面有多少个字符,就需要写几个点
2.后面的\1是指前面括号里边的内容
利用反向引用,取出IP地址
[root@oldboy202 ~]# ifconfig eth0 |sed -n '2p' |sed -r 's#^.*dr:(.*) Bc.*$#\1#g'
10.0.0.202
利用反向引用,取Bcast地址
[root@oldboy202 ~]# ifconfig eth0 |sed -n '2p' |sed -r 's#^.*st:(.*) Ma.*$#\1#g'
10.0.0.255
正则方法4
对某一行进行字符串替换
格式:sed -n '5#原内容#新内容#p' filename
示例:替换oldboy.txt中第5行的oldboy为oldgirl
sed -n '5s#oldboy#oldgirl#gp' oldboy.txt
ifconfig eth0|sed -nr '2s#^.*dr:(.*) Bc.*$#\1#gp'
10.0.0.200
方法5:
[root@oldboyedu37-nb 20170118]# ifconfig eth0 |grep "Bcast" |egrep -o "[0-9.]+"
扩展1:sed文件内容替换
sed -i.bak 's#oldboy#oldgirl#g' oldboy.txt
参数:-i.bak 表示修改文件的时候,先保存为oldboy.txt.bak
注:sed 使用-i参数并且标记完修改之前先备份的时候,如果要使用正则表达式,需要把sed -r参数放到前面,这样:
sed -ri.bak 's#old(b)oy#oldgirl\1#g' oldboy.txt
修改oldoy为oldgirl,同时把b保留下来
修改结果:
my blog is http://oldgirlb.blog.51cto.com
扩展2:使用正则提取/etc/hosts权限
方法1:
[root@oldboyedu37-nb 20170118]# stat /etc/hosts|sed -n '4p'|sed 's#^.*(0##g' |sed 's#/.*$##g'
644
正则方法2:
[root@oldboy202 ~]# stat /etc/hosts | sed -n '4p' |sed -r 's#^.* \(0(.*)\/.*$#\1#g'
644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0
[root@oldboy202 ~]# stat /etc/hosts | sed -n '4p' |sed -r 's#^.* \(0(.*)\/-.*$#\1#g'
644
方法3:
[root@oldboy202 ~]# stat /etc/hosts|sed -nr '4s#^.*\(0(.*)/-.*$#\1#gp'
644
方法4:
[root@oldboy202 ~]# stat /etc/hosts |grep "Uid" |egrep -o "[0-9]{4}"
0644
扩展3:取消某个文件的空行
方法1:
[root@oldboy202 ~]# egrep -v "^$" oldboy.txt
方法2:
[root@oldboy202 ~]# sed '/^$/d' oldboy.txt
方法3:
[root@oldboy202 ~]# awk '!/^$/' oldboy.txt
I am oldgirlb teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
方法4:
[root@oldboy202 ~]# grep '^.' oldboy.txt
方法5:
[root@oldboy202 ~]# grep ".$" oldboy.txt
扩展4:取出文本前两列
[root@oldboy202 ~]# cat ett.txt |egrep "ol+dbo+y"
oldboy
olldboooy
[root@oldboy202 ~]# cat ett.txt |egrep "^o"
oldboy
olldboooy
[root@oldboy202 ~]# cat ett.txt |awk '/ol+dbo+y/'
oldboy
olldboooy
date时间显示
date
+ 以某种格式显示日期
date +%F 年月日
date +%F_%T 年月日时分秒
date %w 星期几,0表示周日
显示三天前日期
date -d "3day" 显示3天后时间
date -d “-3day” 显示3天前时间
date -d “-3hour” 显示3小时前时间
date -d “-3year” 显示3年之前时间
工作中常用方法:
备份的时候需要给文件名,命名。
date +%F -d "-1day"
sed 正则
1 | ## 查找以f或m结尾的行 |
- 本文作者: GaryWu
- 本文链接: https://garywu520.github.io/2017/06/03/老男孩37期-第6节课-正则表达式和通配符/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!