[转帖]Shell编程之正则表达式与文本处理器(grep、sort、uniq、tr、cut)
目录
正则表达式概念
REGEXP: Regular Expressions,由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能,类似于增强版的通配符功能,但与通配符不同,通配符功能是用来处理文件名,而正则表达式是处理文本内容中字符。
正则表达式被很多程序和开发语言所广泛支持:vim, less,grep,sed,awk, nginx,mysql等
正则表达式的作用
主要用来匹配字符串(命令结果,文本内容)
通配符只用于匹配文件名、目录名等,不能用于匹配文件内容。(而且是已存在的文件或者目录)
通配符主要是为了方便用户对文件或者目录的描述,例如用户仅仅需要以".sh"结尾的文件时,使用通配符就能很方便地实现。
各个版本的shell都有通配符,这些通配符是一些特殊的字符,用户可以在命令行的参数中使用这些字符,进行文件名或者路径名的匹配。
shell将把与命令行中指定的匹配规则符合的所有文件名或者路径名作为命令的参数,然后执行这个命令。
*:通配符匹配任意一个或多个字符
ls *.txt
?:通配符
匹配一个任意字符
[root@localhost opt]# ls ?.txt
[] 通配符
[list] 匹配list中任意单个字符
ls [a-z].txt
元字符
. 匹配任意单个字符,可以是一个汉字
[] 匹配指定范围内的任意单个字符,示例:[dn] [0-9] [] [a-zA-Z] [:alpha:]
[^] 匹配指定范围外的任意单个字符,示例:[^dn] [^a.z]
[:alnum:] 字母和数字 [0-9] [a-z] [0-9] [a-z]
[:alpha:] 代表任何英文大小写字符,亦即 [A-Z], [a-z]
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母 [A-Z]
[[:blank:]] 空白字符(空格和制表符)
[:space:] 包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白,比[:blank:]包含的范围广
[:cntrl:] 不可打印的控制字符(退格、删除、警铃…)
[:digit:] 十进制数字
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
\w #匹配单词构成部分,等价于[[:alnum:]]
\W #匹配非单词构成部分,等价于[^[:alnum:]]
\S #匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\s #匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
元字符点(.)
[root@localhost ~]#ls /etc/|grep rc[.0-6]
ls /etc/命令会列出/etc/目录下的所有文件和子目录,
| 符号用于将其输出作为grep命令的输入。
grep命令使用正则表达式rc[.0-6]来匹配文件名中包含rc加数字(0-6)的文件或目录名,
其中方括号[]表示字符集,[.0-6]表示匹配.和0-6这些字符中的任意一个。
#此处的点代表字符
grep命令在文本中查找指定的字符串
grep [选项]… 查找条件 目标文件
选项:
-m # 匹配#次后停止
grep -m 1 root /etc/passwd #多个匹配只取第一个
-v 显示不被pattern匹配到的行,即取反
grep -Ev '[[:space:]]*#|$' /etc/fstab
-i 忽略字符大小写 #可有可无
-n 显示匹配的行号
-c 统计匹配的行数
-o 仅显示匹配到的字符串
-q 静默模式,不输出任何信息
-A # after, 后#行
-B # before, 前#行
-C # context, 前后各#行
-e 实现多个选项间的逻辑or关系,如:grep –e ‘cat ' -e ‘dog' file
-w 匹配整个单词
-E 使用ERE,相当于egrep,使用扩展正则
-F 不支持正则表达式
-f file 根据模式文件,处理两个文件相同内容 把第一个文件作为匹配条件
-r 递归目录,但不处理软链接
-R 递归目录,但处理软链接
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
表示次数
* #匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
.* #任意长度的任意字符,不包括0次,也就是匹配所有
\? #匹配其前面的字符出现0次或1次,即:可有可无
\+ #匹配其前面的字符出现最少1次,即:肯定有且 >=1 次
\{n\} #匹配前面的字符=n次
\{m,n\} #匹配前面的字符至少m次,至多n次
\{,n\} #匹配前面的字符至多n次,<=n
\{n,\} #匹配前面的字符至少n次
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
举例:
sort命令排序
以行为单位对文件内容进行排序,也可以根据不同的数据类型来排序
语法格式:
sort 选项 参数
cat file | sort 选项
常用选项:
-f:忽略大小写,默认会大写字母排在前面
-b:忽略每行前面的空格
-n:按照数字进行排序
-r:反向排序
-u:等同uniq,表示相同的数据仅显示一行,去重
-t:指定字段分隔符,默认使用tab键分隔
-k:指定排序字段
-o <输出文件>:将排序后的结果转存至指定文件
uniq命令快捷去重
uniq命令用于报告或者忽略文件中连续的重复行,常与sort命令结合使用。
格式:
uniq [选项] 参数
cat 文件| uniq 选项
-c 统计连续重复的行的次数,并且合并重复的行
-u 显示仅出现一次的行(包括不连续的重复行)
-d 仅显示重复出现的行(必须是连续的重复行)
tr命令替换、压缩和删除
常用于对来自标准输入的字符进行替换、压缩和删除
语法格式:
tr 选项 参数
常用选项:
-c:保留字符集1的字符,其他的字符(包括换行符\n)用字符集2替换
-d:删除所有属于字符集1的字符
-s:将重复出现的字符串压缩为一个字符串,用字符集2 替换 字符集1
-t:字符集2 替换 字符集1,不加也行
参数:
字符集1:
指定要转换或删除的原字符集。当执行转换操作时,
必须使用参数”字符集2“指定转换操作时,必须使用参数”字符集2“指定转换的目标字符集。
但执行删除操作时,不需要参数”字符集2“
字符集2:
指定要转换成的目标字符集
cut命令快速裁剪命令
expr substr 截取方法
cut截取方法
对字段进行截取和剪裁
格式:
格式一:cut [选项] 参数
格式二:cat file | cut [选项]
-d 指定分隔符(默认分隔符为Tab)
-f 按字段进行截取。指定第n个字段;
-b 以字节为单位进行截取
-c 以字符为单位进行截取
–complement 排除所指定的字段
–output-delimiter 更改输出内容的分隔符
split命令文件拆分
split命令用于在Linux下将大文件拆分为若干小文件。
格式:split 选项 参数 原始文件 拆分后文件名前缀
-l 指定行数
-b 指定文件的大小
paste命令文件合并
按照字段来进行文件的合并
格式:
paste [选项] 文件1 文件2
-d 用于指定文件的分隔符(默认情况下为制表符"\n")
-s 将列和行的内容进行互相交换
重点:paste a b和cat a b 之间的区别 ?
cat 是上下合并,paste 是左右拼接
面试题 统计当前主机的连接状态
统计当前连接主机数
eval变量扫描器
命令字前加上eval,shell会在执行命令之前扫描它两次,eval命令首先会先扫描命令行进行所有的置换,然后再执行命令,该命令适用于那些一次扫描无法实现功能的变量,该命令会对变量进行两次扫描。
脚本运用测试:
#!/bin/bash
#这是一个验证eval扫描的脚本
a=100
b=a
echo "普通echo输出的变量b的值为:" </span>$$b
eval echo "经过eval扫描输出变量b的值为:" </span>$$b
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
位置锚定
^ #行首锚定, 用于模式的最左侧
$ #行尾锚定,用于模式的最右侧
^root$ #用于模式匹配整行 (单独一行 只有root)
^$ #空行
^[[:space:]]*$ #空白行
- 1
- 2
- 3
- 4
- 5
< 或 \b #词首锚定,用于单词模式的左侧(连续的数字,字母,下划线都算单词内部)
> 或 \b #词尾锚定,用于单词模式的右侧
<root> #匹配整个单词
分组或其他
分组:() 将多个字符捆绑在一起,当作一个整体处理
或者:\ |
扩展正则表达式
表示字符相差不大
grep -E 必须用 sed -r
或者
egrep
表示次数
* 匹配前面字符任意次
? 0或1次
+ 1次或多次
{n} 匹配n次
{m,n} 至少m,至多n次
{,n} #匹配前面的字符至多n次,<=n,n可以为0
{n,} #匹配前面的字符至少n次,<=n,n可以为0
- 1
- 2
- 3
- 4
- 5
- 6
- 7
表示分组
() 分组
分组:() 将多个字符捆绑在一起,当作一个整体处理,如:(root)
| 或者
a|b #a或b
C|cat #C或cat
(C|c)at #Cat或cat
[转帖]Shell编程之正则表达式与文本处理器(grep、sort、uniq、tr、cut)的更多相关文章
- Linux学习——shell编程之正则表达式和字符处理命令
shell编程之正则表达式 一 正则表达式 1 什么是正则表达式 正则表达式用于描述字符排列和匹配模式的一种语法规则.它主要用于字符串的模式分隔.匹配.查找及替换操作. 2 shell编程之正则表达式 ...
- Linux 正则表达式与文本处理器 三剑客
Linux 正则表达式与文本处理器 三剑客 一.正则表达式 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则. 在linu ...
- 转-Shell笔记——命令:Sort,uniq,join,cut,paste,split
转自:http://blog.csdn.net/wklken/article/details/6562098 Sort,uniq,join,cut,paste,split 命令—— Sort Sort ...
- 05 shell编程之正则表达式
正则表达式&&文本处理利器 学习目标: l 掌握正则表达式的运用 l 掌握sed.awk文本处理工具的使用 目录结构: 正则表达式 正则表达式概述 l 正则表达式:使用单个字 ...
- shell:正则表达式和文本处理器
1.什么是正则 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则. 生活中处处都是正则: 比如我们描述:4条腿 你可能会想 ...
- shell 编程四剑客简介 find sed grep awk(微信公众号摘抄)
一,Shell编程四剑客之Find 通过如上基础语法的学习,读者对Shell编程有了更近一步的理解,Shell编程不再是简单命令的堆积,而是演变成了各种特殊的语句.各种语法.编程工具.各种命令的集合. ...
- shell编程之正则表达式
什么是正则表达式?正则表达式是用于描述字符排列和匹配模式的一种语法规则.在很多程序设计语言中都支持利用正则表达式来进行字符串的操作,不同语言中的正则表达式略有不同,但是毕竟都是正则,其本质思想都是一致 ...
- Linux Shell编程(23)——文本处理命令
处理文本和文本文件的命令sort文件排序, 通常用在管道中当过滤器来使用. 这个命令可以依据指定的关键字或指定的字符位置, 对文件行进行排序. 使用 -m 选项, 它将会合并预排序的输入文件. 想了解 ...
- Linux Unix shell 编程指南学习笔记(第二部分)
第七章 正則表達式介绍 匹配行首与行尾 匹配数据集 职匹配字母和数字 句点 "." 匹配随意单字符. ^,在行首 匹配字符串或字符序列,如查询当前文件夹下的全部文件夹: ls - ...
- 正则表达式、find、grep、awk、sed
1.正则表达式 (1)正则表达式一般用来描述文本模式的特殊用法,由普通字符(例如字符a-z)以及特殊字符(称为元字符,如/.*.?等)组成. (2)基本元字符集及其含义 ^ :只 ...
随机推荐
- 文心一言 VS 讯飞星火 VS chatgpt (42)-- 算法导论5.4 6题
六.假设将n个球投人 n 个箱子里,其中每次投球独立,并且每个球等可能落入任何箱子.空箱子的数目期望是多少?正好有一个球的箱子的数目期望是多少? 文心一言: 这是一个典型的概率问题.首先,我们可以通过 ...
- 占位图片(Placeholder Image)
一.引言 在网页设计和开发中,占位图片(Placeholder Image)是一种常见的技术手段,用于在用户上传图片之前或者图片加载失败时,展示一个临时替代的图片,以提高用户体验.本文将详细介绍占位图 ...
- Python中的@abstractmethod
@abstractmethod 是 Python 中 abc 模块(Abstract Base Classes)提供的一个装饰器,用于声明抽象方法.抽象方法是指在抽象类中声明但没有提供具体实现的方 ...
- Java 在PDF中添加文本水印、图片水印(基于Spire.Cloud.SDK for Java)
Spire.Cloud.SDK for Java提供了接口pdfWartermarkApi可用于添加文本水印addTextWartermark()和图片水印addImageWartermark()到P ...
- Java 在PPT中添加文本、图片超链接
本文介绍通过Java程序在PPT幻灯片中添加超链接的方法,可以给文本或者图片设置超链接,设置超链接时,可设置包括网页链接.邮件地址链接.幻灯片跳转链接等不同指向对象的链接.文中方法使用了免费版PPT类 ...
- AI推理实践丨多路极致性能目标检测最佳实践设计解密
摘要:基于CANN的多路极致性能目标检测最佳实践设计解密. 本文分享自华为云社区<基于CANN的AI推理最佳实践丨多路极致性能目标检测应用设计解密>,作者: 昇腾CANN . 当前人工智能 ...
- 扎根CNCF社区贡献五年是怎样的体验?听听华为云原生开源团队的负责人怎么说
摘要:本月我们要重点介绍王泽锋(Kevin Wang),他是 CNCF 社区的长期贡献者,华为云原生开源团队的负责人,KubeEdge 和 Volcano 项目的联合创始人.Kevin 回答了几个关于 ...
- 解读顶会CIKM'21 Historical Inertia论文
摘要:本文(Historical Inertia: An Ignored but Powerful Baseline for Long Sequence Time-series Forecasting ...
- Buffer 缓冲区操作
1.缓冲区分片在 NIO 中,除了可以分配或者包装一个缓冲区对象外,还可以根据现有的缓冲区对象来创建一个子缓冲区,即在现有缓冲区上切出一片来作为一个新的缓冲区,但现有的缓冲区与创建的子缓冲区在底层数组 ...
- ECS 挂载 OSS 多Bucket
ECS 挂载 OSS,等同于在ECS 上使用内网的 Bucket 域名,不需要收取流量费用,减少接口代码的编写. CentOS系统 安装 wget http://gosspublic.alicdn.c ...