正则表达式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 ...
随机推荐
- luogu P4219 [BJOI2014]大融合
题解:原来LCT也能维护子树信息,我太Naive了 用LCT维护当前子树节点个数 具体做法维护siz[x]=当前Splay子树和指向当前Splay子树的虚边所代表的节点个数 auxsiz[x]=指向x ...
- C基础 带你手写 redis ae 事件驱动模型
引言 - 整体认识 redis ae 事件驱动模型, 网上聊得很多. 但当你仔细看完一篇又一篇之后, 可能你看的很舒服, 但对于 作者为什么要这么写, 出发点, 好处, 缺点 ... 可能还是好模糊, ...
- Python-查找并保存特定字符串后面的字符串
-- -- 本算法用于查找并存储“特定字符串”后面的字符串. -- 举例: strli = "kaka is li is da is wei !" #用于查找的字符串 sep_li ...
- poj 3013 最短路SPFA算法
POJ_3013_最短路 Big Christmas Tree Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 23630 ...
- 通过ES6 封装了一个上传文件的方法 XMLHttpRequest() 通用
### 上传进度回显,上传速度回显 ### 源码如下,新建index.js装起来 export class UploadServers { constructor (options) { this.x ...
- 吴裕雄--天生自然 PYTHON3开发学习:基本数据类型
#!/usr/bin/python3 counter = 100 # 整型变量 miles = 1000.0 # 浮点型变量 name = "runoob" # 字符串 print ...
- msf渗透安卓手机
正文开始 首先你需要kali系统 生成木马 首先ifconfig查看本机在局域网内的ip 使用msfvenom生成apk木马 msfvenom -p android/meterpreter/rever ...
- C/C++ 取整函数ceil(),floor()
使用floor函数.floor(x)返回的是小于或等于x的最大整数.如: floor(10.5) == 10 floor(-10.5) == -11 使用ceil函数.ceil(x)返回 ...
- day63-html-列表,表格,标签的嵌套规则
1.列表 1.无序列表 <ul type="disc"> <li>a</li> <li>b</li> </ul&g ...
- vscode Cannot edit in read-only editor.
原因 使用了runcode插件 这个错误一般出现在使用命令行输入的时候出现. 但是output页面是只读的,只能输出,不能用来输入. 解决 解放方法是,将run code设置为在Teminal中运行: ...