Linux学习笔记之grep命令和使用正则表达式
时间:2022-06-25
本文章向大家介绍Linux学习笔记之grep命令和使用正则表达式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
0x00 正则表达式概述
正则表达式是描述一些字符串的模式,是由一些元字符和字符组成的字符串,而这些元字符是一些表示特殊意义的字符,即被正则表达式引擎表达的字符表示与其本意不同的一些字符。
0x01 正则表达式的分类
基本正则表达式 扩展正则表达式
# 这两种分类其支持的元字符不同;
0x02 基本正则表达式的元字符
1、匹配字符:
.: 匹配任意单个字符
[]: 匹配范围内的任意单个字符
[^]: 匹配范围外的任意单个字符
[:space:]: 空格
[:upper:]: 大写字母
[:lower:]: 小写字母
[:alpha:]: 所有字母
[:alnum:]: 所有的数字和字母
[:digit:]: 所有的数字
[:punct:]: 所有的标点符号
2、匹配个数:
*: 匹配其前字符任意次(包括0次)
?: 匹配其前字符0或1次,即至多一次
+: 匹配其前字符1次或多次,即至少一次
{m}: 匹配其前字符m次
{m,n}: 匹配其前字符至少m次,至多n次
{0,n}: 匹配其前字符至多n次
{m,}: 匹配其前字符至少m次
3、位置锚定:
^: 行首锚定
$: 行尾锚定
^PATTERN$: 用于PATTERN来匹配整行
^$: 空白行
^[[:space:]]*$: 空行或包含空白字符的行
单词:非特殊字符组成的连续字符(字符串)都称为单词
<或b: 词首锚定
>或b: 词尾锚定
<PATTERN>: 匹配完整单词
4、分组及引用:
(): 将括号内的内容作为一个整体进行匹配
正则表达式引擎会从左第一个左括号对应括号的分组匹配到的内容保存至变量1中,第二个左括号中匹配到的内容保存至变量2中,以此类推;
引用:引用是在一个正则表达式当中有可能出现要使用前面分组中所匹配到的内容,而每次分组中匹配到的内容可能不相同,此时要和分组中匹配的内容相同的话就得使用引用。利用1,2变量来引用前面对应括号内的PATTERN;
1
2
...
0x03 扩展正则表达式的元字符
1、匹配字符:
.: 匹配任意单个字符
[]: 匹配范围内的任意单个字符
[^]: 匹配范围外的任意单个字符
[:space:]: 空格
[:upper:]: 大写字母
[:lower:]: 小写字母
[:alpha:]: 所有字母
[:alnum:]: 所有的数字和字母
[:digit:]: 所有的数字
[:punct:]: 所有的标点符号
2、匹配个数:
*: 匹配其前字符任意次(包括0次)
?: 匹配其前字符0或1次,即至多一次
+: 匹配其前字符1次或多次,即至少一次
{m}: 匹配其前字符m次
{m,n}: 匹配其前字符至少m次,至多n次
{0,n}: 匹配其前字符至多n次
{m,}: 匹配其前字符至少m次
3、位置锚定:
^: 行首锚定
$: 行尾锚定
<或b: 词首锚定
>或b: 词尾锚定
4、分组及引用:
(): 将括号内的内容作为一个整体进行匹配
1
2
...
5、或:
|: |左边的整体或上右边的整体;
C|cat: 表示C或cat
(c|C)at: 表示cat或Cat
0x04 正则表达式的使用和grep的使用
正则表示一般和一些其他的命令一块使用,只要该命令支持正则表达式的引擎,那么就可以使用正则表达式;下面介绍的grep命令就是一个行处理文本工具,其配合正则表达式的使用,大大提高了文本处理的效率。
grep、egrep、fgrep命令的介绍
grep,egrep,fgrep这三个命令同属于一脉,它们的功能是输出模式匹配到的行,其原理是寻找从标准输入的文件中包含被给定模式所匹配到的行,grep命令,默认输出被模式匹配到的行;
- grep命令默认支持基本正则表达式;
- egrep命令默认支持扩展正则表达式,相当于grep -E;
- fgrep命令不支持正则表达式。
grep命令的使用
1、命令格式
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
2、命令选项:
--color=auto: 对匹配到的文本着色后高亮显示
-i, --ignore-case: 忽略字符的大小写
-o: 显示模式匹配到的字符;
-v, --invert-match: 显示不能被模式匹配到的行;
-E: 支持使用扩展的正则表达式元字符;
-q, --quiet, --silent: 静默模式,即不输出任何信息;
-A #: 显示匹配到的行以及该行后#行
-B #: 显示匹配到的行以及该行前#行
-C #: 显示匹配到的行以及该行前后#行
egrep命令的使用和grep一样,命令选项也相同;
fgrep命令不支持正则表达式元字符;
当无需用到元字符去编写模式式,使用fgrep必能更好;
0x05 练习
1、显示/etc/passwd文件中以bash结尾的行
# grep "bash$" /etc/passwd
2、显示/etc/passwd文件中的两位数或三位数
# grep -E "(<[1-9][0-9]>)|(<[1-9][0-9][0-9]>)" /etc/passwd
3、显示netstat -tan
命令结果中以‘LISTEN’后跟0个、1个或者多个空白字符结尾的行
# netstat -tan | grep "LISTEN[[:space:]]*$"
4、添加用户bash、testbash、basher以及nologin用户(nologin用户的shell为/sbin/nologin);而后找出/etc/passwd文件中用户名与其shell名相同的行
# grep -E "^([^:]+>).*1$" /etc/passwd
5、显示当前系统上root、centos或者user1用户的默认shell和UID (请事先创建这些用户,若不存在)
# grep -E "^(<root|centos|user1>)" /etc/passwd | cut -d: -f 3,7
6、找出/etc/rc.d/init.d/functions文件中某单词(单词中间可以存在下划线)后面跟着一组小括号的行
# grep -E "<.*>()" /etc/rc.d/init.d/functions
7、使用echo输出一个路径,而后egrep找出其路径基名;进一步的使用egrep取出其目录名以及目录路径
# echo /etc/sysconfig/network-script/ifdown-eth0 | egrep -o "[[:alpha:]]+[^/]?[[:alnum:]]+$"
# echo /etc/sysconfig/network-script/ifdown-eth0 | egrep -o "(.*)/" | egrep -o "[[:alpha:]]+[^/]?[[:alpha:]]+/$" | egrep -o "[[:alpha:]]+[[:punct:]]?[[:alpha:]]+"
# echo /etc/sysconfig/network-script/ifdown-eth0 | egrep -o "/.*/" | egrep -o ".*[[:alnum:]]+"
8、找出ifconfig命令执行结果中1-255之间的数字
# ifconfig | grep -E -o “<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])>”
9、取出ifconfig ens33命令结果中的ip地址
# ifconfig ens33 | grep -E -o "<([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])>.<([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])>.<([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])>.<([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])>"
参考
- AVFoundation 框架初探究(二)
- 关于视图和存储过程的权限问题探究 (r9笔记第87天)
- Java基础-day08-超市购物系统总结
- AVFoundation 框架初探究(一)
- 【Go 语言社区】 HTML5 前端--数据保存实例
- crontab设置导致的服务器进程异常问题 (r10笔记第4天)
- 一条SQL语句的执行计划变化探究(r10笔记第3天)
- tensorflow(一)windows 10 python3.6安装tensorflow1.4与基本概念解读
- 基于AgileEAS.NET SOA 中间件领域模型数据器快速打造自己的代码生成器
- Java基础-day07-代码题-自定义数据类型;ArrayList集合
- 一条报警信息的快速处理和分析(r9笔记第99天)
- 【Go 语言社区】解析Go语言编程中的struct结构
- centos+scala2.11.4+hadoop2.3+spark1.3.1环境搭建
- 【Go 语言社区】Golang 语言获取本机逻辑CPU数量的方法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法