前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux||正则表达式及grep命令

Linux||正则表达式及grep命令

作者头像
小汪Waud
发布2023-02-03 14:58:18
1K0
发布2023-02-03 14:58:18
举报
文章被收录于专栏:小汪Waud小汪Waud

本期介绍在Linux环境下的正则表达式及grep命令。

1 正则表达式

正则表达式(Regular Expression)是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符及这些字符的特定组合,组成一个“规则字符串”,这个字符串用来表达对字符串的一种过滤逻辑。

正则表达式基本上是一种表示法,只要程序支持这种表示法,该程序就可以用来作为正则表达式的字符串处理之用。如vi、grep、awk、sed等程序支持正则表达式,所以可以使用正则表达式的特殊字符来进行字符串的处理。但例如cp、ls等命令并不支持正则表达式,所以只能用自己的通配符。

需要注意的是,正则表达式与通配符有着本质上的区别。 鸟叔的解释是通配符(wildcard)代表的是bash操作接口的一个功能,但正则表达式则是一种字符串处理的表示方式。同时,因为正则表达式是处理字符串的一种表达方式,所以对字符排序有影响的语序数据会对正则表达式的结果有影响。

正则表达式依照不同的严谨度分为:基础正则表达式和扩展正则表达式。

1.1 基础正则表达式

  • ^ 待查找的字符串在行首
  • $ 待查找的字符串在行尾
  • . 换行符以外的任意单个字符
  • *匹配之前项0次或多次
  • {n} 匹配之前项n次
  • {n,} 匹配至少n次
  • {m,n} 匹配至少m次,至多n次
  • [list] 匹配list中任意一个
  • [n1-n2] 匹配范围如[A-Z]即匹配所有大写字符
  • [^list] 反向匹配list

注意!

  1. { }为限定范围的字符,但因为 { 和 } 的符号在shell中是有特殊意义的,因此必须使用转义符" \ "使其失去特殊意义。
  2. *作为通配符时表示0~无限个字符的意思,而作为正则表达式时表示匹配之前项0次或多次。
代码语言:javascript
复制
# 输出任何以a为结尾的文件
ls *a # 通配符
ls | grep '.*a$' # 正则表达式

1.2 扩展正则表达式

  • +:匹配前面的字符1次或多次
  • ?:匹配前面的字符0次或1次
  • |:用或的方式找出多个字符串
  • ( ):匹配群组字符串
  • ( )+:多个重复群组的判别

2 grep命令

grep是一种强大的文本搜索工具,可以使用正则表达式匹配模式查找文件里符合条件的字符串,并打印出来。

有点类似于WORD里的查找功能。

grep支持三种正则表达式语法:Basic、Extended和perl兼容。如果没有提供正则表达式类型,grep将搜索模式解释为基本的正则表达式。要将模式解释为扩展正则表达式,请使用-E。

查看grep的帮助文档,如下

代码语言:javascript
复制
Usage: grep [OPTION]... PATTERN [FILE]...
Search for PATTERN in each FILE or standard input.
PATTERN is, by default, a basic regular expression (BRE).
Example: grep -i 'hello world' menu.h main.c
参数太长,这里就不放了

基本用法

grep [OPTION]... PATTERN [FILE]...

高级用法

grep [-A] [-B] [--color=auto] "查找字符" [模式] [文件]

  • -A:after 后面可加数字,表示除了该行,后面n行也将打印出来
  • -B:before 后面可加数字,表示除了该行,前面n行也将打印出来
  • --color=auto 可将查找出来的字符标注颜色
  • 文件可为空格间隔的多个文件。

常用参数

  • -w word,以字符串为单位,精确查找每个关键词
  • -f 从指定文件中读取要匹配的字符
  • -r 从指定目录中查找
  • -v 反向选择,输出没有匹配的行
  • -n 显示成功匹配的行所在的行号
  • -e else,指定多个关键词
  • -c 统计成功匹配的行的数量
  • -i 忽略大小写

示例1

首先通过cat命令查看samples.txt的内容,如下图

如果想检索以K为行首的行,通过以下命令即可得到

代码语言:javascript
复制
grep '^K' samples.txt # 注意^在K前面

grep '^K' samples.txt

如果想检索以Z为行尾的行,通过以下命令即可得到

代码语言:javascript
复制
grep 'z$' samples.txt # 注意$在z后面

grep 'z$' samples.txt

如果想检索三个字符其中前面为K,后面为D中间字符,为任意字符,通过以下命令即可得到

代码语言:javascript
复制
grep 'K.D' samples.txt

grep 'K.D' samples.txt

参考资料

  1. 菜鸟教程

https://www.runoob.com/linux/linux-comm-grep.html

  1. 「生信技能树」2021公益课(linux基础 & conda)

https://www.bilibili.com/video/BV1Yy4y117SX?p=12

  1. 鸟哥的Linux私房菜
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-08-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小汪Waud 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 正则表达式
    • 1.1 基础正则表达式
      • 1.2 扩展正则表达式
      • 2 grep命令
        • 示例1
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档