正则表达式grep学习(一)
文本处理三剑客
grep
文本过滤
sed
流过滤
awk
格式处理
正则表达式
就是一些特殊字符组成的模式,赋予了他特定的含义
在大多数程序里,正则表达式都被置于两个正斜杠之间;例如/l[o0]ve/就是由正斜杠界定的正则表达式,它将匹配被查找的行中任何位置
出现的相同模式。在正则表达式中,元字符是最重要的概念。
正则表达式的作用:
在企业工作中,我们每天做的linux运维工作中,时刻都会面对大量带有字符串的文本配置、程序、命令输出以及日志文件等,而我们经常会
有迫切的需要,从大量的字符串内容中查找符号工作需要特定的字符串。着就要靠正则表达式。因此,可以说正则表达式就是为了过滤这样
字符串的需求而生的!
1)inux正则表达式grep,sed,awk
2)大量的字符串文件需要进行配置,而且非交互式的
3)过滤相关的字符串,匹配字符串,打印字符串
正则表达式注意事项:
1)正则表达式应用非常广泛,存在于各种语言中,例如:php,java,python等
2)正则表达式和通配符特殊字符是有本质区别的
3)想要学号grep、sed、awk首先就要掌握正则表达式
通配符
)*
任意字符
[root@xiaoming re]# ls /etc/*host*
/etc/host.conf /etc/hostname /etc/hosts /etc/hosts.allow /etc/hosts.deny 2)?
任意单个字符
[root@xiaoming re]# ls /etc/host?
/etc/hosts 3)[]
范围 [a-z] [A-Z] [0-9]
[root@xiaoming re]# ls
14asd 55ad 5Asad ASASD asdas Dasd sasdA sddd
[root@xiaoming re]# ls [a-z]*
ASASD asdas Dasd sasdA sddd
[root@xiaoming re]# ls [0-9][0-9]*
14asd 55ad
[root@xiaoming re]# ls [a-z][A-Z][a-z]*
ASASD asdas sddd
[root@xiaoming re]# ls [a-zA-Z0-9]*
14asd 55ad 5Asad ASASD asdas Dasd sasdA sddd 4){}
序列
[root@xiaoming re]# touch {1..10}
[root@xiaoming re]# ls
1 10 2 3 4 5 6 7 8 9 [root@xiaoming re]# touch {01..10}
[root@xiaoming re]# ls
01 02 03 04 05 06 07 08 09 10 //批量增加用户脚本
[root@xiaoming re]# cat useradd.sh
for i in {00..10}
do
useradd oldboy$i
done
特殊字符:
"" 可以引用特殊字符,比如$
'' 所见即所得
``=$() 命令,优先执行 # 注释行;命令提示符身份
$ 变量;命令提示符身份 ; cmd1;cmd2 表示先执行cmd1,再执行cmd2
&& cmd1 && cmd2 表示cmd1执行成功后,再执行cmd2
|| cmd1 || cmd2 表示cmd1执行失败后,再执行cmd2 ! 取反
history,调用之前的命令 重定向
<
>
>>
>
>>
&>/dev/null
>/dev/null >&
>/dev/null >/dev/null 管道符
| ~ 家目录
.
当前目录
在文件名前面,表示隐藏
chown改属组
..
上一级目录
-
文件类型,普通文件
cd - 进入上次目录
su - 切换用户
%
+
chmod加属性
[root@xiaoming re]# name=xiaoming
[root@xiaoming re]# echo 'my name is $name'
my name is $name
[root@xiaoming re]# echo "my name is $name"
my name is xiaoming
[root@xiaoming re]# echo my name is $name
my name is xiaoming
[root@xiaoming re]# test="my name is $name"
[root@xiaoming re]# echo $name
xiaoming
[root@xiaoming re]# test1=echo my name is $name
-bash: my: 未找到命令
grep,默认以行为单位
命令选项
-i 忽略大小写
[root@xiaoming re]# grep documentroot /etc/httpd/conf/httpd.conf
[root@xiaoming re]# grep -i documentroot /etc/httpd/conf/httpd.conf
# DocumentRoot: The directory out of which you will serve your
DocumentRoot "/var/www/html"
# access content that does not live under the DocumentRoot.
--color=auto 高亮显示
centos6默认没做别名,可以自己添加别名
-o 详细过程,显示满足条件的字符
-v 反向过滤
-E egrep
-q 静默输出
不需要看命令输出,只提供命令执行状态来判断是否执行成功
-n 显示行号
正则表达式实战
正则表达式:
BRE:基础正则
grep
ERE:扩展正则
egrep
grep -E
基础正则表达式
字符匹配:
. 匹配任意单个字符:除开空行
[ ] 匹指定范围内的任意单个字符
[^ ] 匹配指定范围外的任意单个字符
[[:space:]] 空白字符
[[:digit:]] 所有数字 [-]
[[:lower:]] 所有小写字母 [a-z]
[[:upper:]] 所有大写字母 [A-Z]
[[:alpha:]] 所有大小写字母 [a-zA-Z] [a-Z]
[[:alnum:]] 所有字母和数字 [a-zA-Z0-]
[[:punct:]] 所有标点符号
练习:
模板:
[root@xiaoming re]# cat re.txt
I am oldboy teacher!
I teach linux.
test I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.oldboy.com
my qq num is .
not .
案例1:验证''.',匹配任意单个字符,可以使用-o来验证
[root@xiaoming re]# grep '.' re.txt
I am oldboy teacher!
I teach linux.
test
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.oldboy.com
my qq num is .
not .
案例2:验证[]里面无论写多少字符,都是或关系,只匹匹配单个字符案例2:验证[]里面无论写多少字符,都是或关系,只匹匹配单个字符
//过滤出包含所有小写字母和数字连在一起的两个字符
grep '[a-z][0-9]' re.txt
//过滤出包含所有小写字母或数字8的单个字符
grep '[a-z8]' re.txt
匹配次数:用在要指定其出现的次数的字符的后面,用于限制其前面字符出现的字数
* 匹配其前面的字符任意次:,,多次;
例如:grep "x*y"
abxy、aby、xxxxy、yab
.* 匹配任意长度的任意字符;贪婪匹配
\? 匹配其前面的字符1次或0次,也就是说其前面的字符是可有可无的;
\+ 匹配其前面的字符1次或多次,也就是说其前面的字符至少出现1次;
\{m\} 匹配其前面的字符m次,m是可以为0的正整数;
\{m,n\} 匹配其前面的字符至少m次,至多n次,n<=m;
\{,n\} 至多n次;
\{m,\} 至少m次;
案例1:贪婪匹配
[root@xiaoming re]# grep -o "8*" re.txt [root@xiaoming re]# grep -o "" re.txt //过滤出所有字符数字连在一起的字符串
[root@xiaoming re]# grep '[a-z0-9]*' re.txt
案例2:过滤身份证号
分析:身份证号18位,前17位必须是数字,最后一位是数字或X
grep '^[0-9]\{17\}[0-9X]$' .txt
模板:
12121212125151515X
22222222222222222A
111111111111111111111111asd
11111111111111111a
案例3:精准匹配
[root@xiaoming re]# grep "8\?" re.txt
I am oldboy teacher!
I teach linux.
test I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.oldboy.com
my qq num is .
not .
[root@xiaoming re]# grep -o "8\?" re.txt
案例4:
[root@xiaoming re]# grep -o "8\+" re.txt [root@xiaoming re]# grep "8\+" re.txt
my qq num is .
not .
案例5:
[root@xiaoming re]# grep "8\{1\}" re.txt
my qq num is .
not .
[root@xiaoming re]# grep -o "8\{1\}" re.txt
[root@xiaoming re]# grep -o "8\{2\}" re.txt
[root@xiaoming re]# grep -o "8\{3\}" re.txt
位置锚定:
^ 匹配行首,awk中,^是匹配模式的最左侧
$ 匹配行尾,awk中,$是匹配模式的最右侧
^PATTERN$ 用PATTERNL来匹配整行
^$ 空白行
^[[:space:]]*$:空行 单词:非特殊字符组成的连续字符串都称为单词
\<或\b:词首锚定,用于单词的左侧
\>或\b:词尾锚定,用于单词的右侧
\<PATTERN\>:匹配完整单词
案例1:过滤以小写字母开头的行
grep "^[a-z]" re.txt
grep "^[[:lower:]]" re.txt 案例2:过滤出不是以小写字母开头的行
grep "^[^a-z]" re.txt #不包含空行,推荐
grep -v "^[a-z]" re.txt
注意:如果^和$在[]里面, 没有任何含义 案例3:过滤以大写字母开头的行
grep "^[A-Z]" re.txt
grep "^[[:uper:]]" re.txt 案例4:过滤出以m结尾的行
grep "m$" re.txt 查看文件内特殊字符:
[root@xiaoming re]# cat A re.txt 案例5:过滤出以.结尾的行
grep "\.$" re.txt
grep '[.]$' re.txt
注意: .代表任意单个字符,所以要转义 案例6:过滤出不以.结尾的行
grep '[^.]$' re.txt
grep -v '[.]$' re.txt 案例7:过滤出空行,并列出行号
grep -n "^$" re.txt
上面的答案只能过滤空行,不能满足包含空格的行,下面才是正解
[root@xiaoming re]# grep -n "^[[:space:]]*$" re.txt
: 案例8::过滤出非空行(空喊意味着什么都没有)
grep -v "^$" re.txt 案例9:
oldboy:x::::/home/oldboy:/bin/bash
[root@xiaoming re]# grep "\boldboy\b>" /etc/passwd
[root@xiaoming re]# grep "\boldboy\b" /etc/passwd
oldboy:x::::/home/oldboy:/bin/bash
扩展正则
相比标准正则的区别
grep -E
egrep
字符匹配:
| 交替匹配|两边的任意一项ab(c|d)匹配abc或abd 匹配次数:用在要指定其出现的次数的字符的后面,用于限制其前面字符出现的字数
* 匹配其前面的字符任意次:,,多次;
例如:grep "x*y"
abxy、aby、xxxxy、yab
.* 匹配任意长度的任意字符;贪婪匹配
? 匹配其前面的字符1次或0次,也就是说其前面的字符是可有可无的;
+ 匹配其前面的字符1次或多次,也就是说其前面的字符至少出现1次;
() 匹配表达式,创建一个用于匹配的子串;
{m} 匹配其前面的字符m次,m是可以为0的正整数;
{m,n} 匹配其前面的字符至少m次,至多n次,n<=m;
{,n} 至多n次;
{m,} 至少m次;
课后练习
基本正则练习:
、找出/etc/passwd文件中的两位数或三位数的行
grep '\<[0-9]\{2,3\}\>' /etc/passwd 、找出/etc/grub2.cfg文档中,至少一个空白字符开头,且后面非空白字符的行
grep '^[[:space:]]\+[^[:space:]]\+' /etc/grub2.cfg 、找出"netstat -ant" 命令的结果以"LISTEN"后跟0、1或多个空白字符结尾的行
netstat -ant | grep 'LISTEN[[:space:]]*'
netstat -ant | grep -i 'listen[[:space:]]*'
扩展正则练习:
、找出/etc/passwd文件中的两位数或三位数的行
egrep '\<[0-9]{2,3}\>' /etc/passwd
grep -E '\<[0-9]{2,3}\>' /etc/passwd 、找出/etc/grub2.cfg文档中,至少一个空白字符开头,且后面非空白字符的行
egrep '^[[:space:]]+[^[:space:]]+' /etc/grub2.cfg 、找出/prop/meminfo文件中,所有大写或小写s开头的行:至少三种实现方式
egrep '^(s|S)' /proc/meminfo
egrep '^[sS]' /proc/meminfo
egrep -i '^s' /proc/meminfo 、显示当前系统上root、CentOS或user1用户的相关信息
egrep '^(root|CentOS|user1)\>' /etc/passwd 、找出/etc/init.d/functions文件中某单词后跟一个小括号的行
egrep '[_a-Z]+\(\)' /etc/init.d/functions 、找出ifconfig命令结果中的1-255之间的数值
- [-]
- [-][-]
- [-][-]
- [-][-]
- [-]
ifconfig | egrep '\<([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>' 、找出ifconfig命令结果中的ip地址
ifconfig | grep -Eoe "(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])" -Eoe '^(e|b)[[:lower:]]+[[:digit:]]+?'
正则表达式grep学习(一)的更多相关文章
- Linux正则表达式grep与egrep
grep -io "http:/=[A-Z0-9]\{16\}" ./wsxf.txt >wsxf_urls.txt Linux正则表达式grep与egrep 正则表达式:它 ...
- grep与正则表达式,grep、egrep和fgrep
grep用法详解:grep与正则表达式 首先要记住的是: 正则表达式与通配符不一样,它们表示的含义并不相同!正则表达式只是一种表示法,只要工具支持这种表示法, 那么该工具就可以处理正则表达式的字符串. ...
- Linux的正则表达式grep,egrep
一.概念 正则表达式是对字符串操作的一种逻辑公式,用事先定义好的一组特殊字符,组成一个"规则字符集合",根据用户指定的文本模式对目标文件进行逐行搜索匹配,显示能被模式匹配到的结果. ...
- Grep学习笔记
Grep(Global search Regular Expression and Print out the line)是一种强大的文本搜索工具. 1. 正则表达式的基本组成部分 正则表达式 描述 ...
- 使用方便 正则表达式grep,sed,awk(一)
一些无稽之谈: 对于正则表达式,永远似了解不明白,看到一些代码,脚本定期,awk,sed.心里总有点虚.主要是记不住.平时又没怎么用,也就没总结了. 如今有空,决定总结一下,顺便克服一下看到shell ...
- Linux正则表达式grep
正则表达式是一种符号表示法,用于识别文本模式.Linux处理正则表达式的主要程序是grep.grep搜索与正则表达式匹配的行,并将结果输送至标准输出. 1. grep匹配模式 grep按下述方式接受选 ...
- python基础之 re(正则表达式)模块学习
今天学习了Python中有关正则表达式的知识.关于正则表达式的语法,不作过多解释,网上有许多学习的资料.这里主要介绍Python中常用的正则表达式处理函数. re.match re.match 尝试从 ...
- Python学习笔记6-Python中re(正则表达式)模块学习
今天学习了Python中有关正则表达式的知识.关于正则表达式的语法,不作过多解释,网上有许多学习的资料.这里主要介绍Python中常用的正则表达式处理函数. re.match re.match 尝试从 ...
- Linux基础正则表达式:grep,sed
先说明语系对正则表达式的影响 LANG=C:0,1,2,3,4...A,B,C,D...Z a b c d ... z LANG=zh_CN:0,1,2,3,4...a A b B c C ...
随机推荐
- Codeforces 1291A - Even But Not Even
题目大意: 给定一个字符串数字(很大) 问能不能删除一些数字(或者不删除) 使得剩余的数字各位数相加是偶数,但是这整个数字是个奇数 解题思路: 统计字符串中单个数字奇数的个数 分情况 个数为0或者1时 ...
- k8s中解决容器时差问题
解决k8s的pod容器的时差常用的两种方式: 1.通过设置pod 模板中的环境变量 env解决 在pod的模板中添加以下: apiVersion: v1 kind: Podmetadata: na ...
- 云平台发展前沿报告 微软云平台——Windows Azure
微软云平台——Windows Azure Windows Azure 是微软研发的公有云计算平台.该平台可供企业在互联网上运行应用,并可进行扩展.通过Windows Azure,企业能够在多个数据中心 ...
- vue累加计数器
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 数字证书原理(ssl,https)
https://blog.csdn.net/qq_34115899/article/details/81298284 关于私钥公钥数字签名数字证书.https.RSA的一些讲解 http://www. ...
- 100道Java面试题整理(助力2020面试!)
1.您对微服务有何了解? 微服务,又称微服务 架 构,是一种架构风格,它将应用程序构建为以业务领域为模型的小型自治服务集合 . 通俗地说,你必须看到蜜蜂如何通过对齐六角形蜡细胞来构建它们的蜂窝状物.他 ...
- 0CTF-2016-piapiapia-PHP反序列化长度变化尾部字符串逃逸
0X00 扫描一下网站目录,得到网站源码,这里说下工具使用的是dirmap,亲测御剑不好用... 0x01 审计源码: index.php <?php require_once('class.p ...
- Thread--线程间通信--管道
在Java语言中提供了各种各样的输入/输出流Stream,使我们能够方便的对数据进行操作,其中管道流是一种特殊的流,用于在不同线程间直接传送数据.一个线程发送数据到输出管道,另一个线程从输入管道中读数 ...
- CentOS8上用Docker部署开源项目Tcloud
一.安装Docker 1.我是虚拟机装的Centos7,linux 3.10 内核,docker官方说至少3.8以上,建议3.10以上(ubuntu下要linux内核3.8以上) root账户登录,查 ...
- mybatis框架快速入门
通过快速入门示例,我们发现使用mybatis 是非常容易的一件事情,因为只需要编写 Dao 接口并且按照 mybatis要求编写两个配置文件,就可以实现功能.远比我们之前的jdbc方便多了.(我们使用 ...