热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

grep文本过滤工具与正则表达式

nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd

grep文本过滤工具

命令:grep

格式:grep [OPTIONS] PATTERN

选项:  --color=auto 将匹配的结果着色显示

-v 反向匹配

-i 忽略大小写

-n 显示的结果前增加行号

-c 仅显示匹配到结果的行数

-o 仅显示匹配到的字符串

-q 静默模式,不输出任何信息

相当于 &> /dev/null

-A# 显示关键字行及向后#行

-B# 显示关键字行及向前#行

-C# 显示关键字向前#行,当前行,及向后#行

-e 关键字1 -e 关键字2  实现多个选项间的逻辑or关系

-w 匹配整个单词

-E 使用扩展正则表达式 或egrep

-F 不使用正则表达式 或 fgrep

Patten格式:引用变量或文本用“”or‘’引起来,

                      引用命令则用``(反引号)引起来。

正则表达式

正则表达式是由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能。支持程序有grep,sed,awk,vim,less,nginx,varnish……它分为基本正则表达式和扩展正则表达式两类,用于grep中,则grep后支持基本正则表达式,grep -E或egrep后支持扩展正则表达式。

字符匹配

字符

含义

.

匹配单个字符

[]

匹配指定范围内的任意单个字符

[^]

匹配指定范围外的任意单个字符

[:alnum:]

所有字母和数字

[:alpha:]

所有大小写字母(a-z&A-Z)

[:lower:]

小写字母(a-z)

[:upper:]

大写字母(A-Z)

[:digit:]

十进制数字(0-9)

[:xdigit:]

十六进制数字

[:blank:]

空白字符(空格和制表符tab)

[:space:]

水平和垂直的空白字符(比[:black:]范围广)

[:punct:]

标点符号

[:graph:]

可打印的非空白字符

[:print:]

可打印字符

[:cntrl:]

不可打印的控制字符(退格、删除、警铃……)

匹配次数

匹配次数用于要指定次数的字符后面,用于指定前面的字符要出现的次数。

字符

含义

*

匹配前面的字符任意次,包括0次

      (贪婪模式:尽可能长的匹配)

.*

匹配任意长度的任意字符

\?

匹配其前面的字符0次或1次

\+

匹配其前面的字符至少1次

\{n\}

匹配其前面的字符n次

\{m,n\}

匹配其前面的字符至少m次,至多n次

\{,n\}

匹配其前面的字符至多n次

\{n,\}

匹配其前面的字符至少n次

位置锚定

位置锚定用于定位出现的位置。

字符

含义

^

行首锚定,用于模式的最左侧

$

行尾锚定,用于模式的最右侧

^PATTERN$

用于模式匹配整行

        ^$  空行

        ^[[:space:]]$  空白行

\

词首锚定,用于单词模式的左侧

\> or \b

词尾锚定,用于单词模式的右侧

\

匹配整个单词

后向引用

说到后向引用,我们先要了解一个概念——分组。分组就是用()把一个或多个字符捆绑在一起,当做一个整体进行处理,当然,在我们的基本正则表达式中,()需要用\来转义,所以,用法如下:

\(root\)\+  代表匹配root至少一次

在分组括号中的模式匹配到的内容会被正则表达式引擎记录与内部的变量中,这些变量的命名方式为:\1,\2,\3……

\n就是从左侧起第n个左括号以及与之匹配的有括号之间的模式所匹配到的字符。

eg:\(string1\+\(string2\)*\)

        \1 :string1\+\(string2\)*

        \2 :string2

后向引用:引用前面的分组括号中的模式所匹配的字符,而非模式本身。

单说概念大家应该不会很明白,那我们来看一个例子,因为后向引用很重要,所以我们就说细致一点。(敲黑板!划重点!)

这个是我们的文件,如果我们想匹配所有行,应该怎么做呢?就用到我们上面所说到的正则表达式的知识。

我们把这个命令单独拉出来说:grep "^h.\{4\}.*h.\{4\}$" example

^h.\{4\}表示匹配以h后加任意4个字符为开头,.*表示匹配任意多个字符,h.\{4\}$表示匹配以h后加任意4个字符为结尾。hello和hiiii都是以h后跟4个任意字符组成的,所以上述命令就可以匹配所有的行。

那么,如果我只想匹配开头和结尾单词一样的行呢?也就是职匹配前两行。这个时候,我们就要用到后向引用了,如下:

上述命令就可以完成我们的需求,我们来详细的说一下这个命令。

分为两部分:红框内:\(h.\{4\}\)  蓝框内:\1

先说红框内的,这个和我们上一个示例没有区别,只是加了\(\)括起来,含义还是不变,依然表示h后跟任意4个字符。

那么蓝框内呢?是什么意思?

“\1”表示的就是从左侧起第1个左括号以及与之匹配的有括号之间的模式所匹配到的字符。上述我们只有一对括号,所以蓝框内的“\1”表示的就是红框内“\(h.\{4\}\)”所匹配到的内容。如果没看明白,那么看看下面这张图吧:

现在可以明白为什么要添加括号分组了吗?因为当我们添加了括号分组,“h.\{4\}”就成为整个正则中第1个分组中的正则,当“h.\{4\}”匹配到的结果为hello时,“\1”引用的就是hello,当“h.\{4\}”匹配到的结果是hiiii时,“\1”引用的就是hiiii。

这个就是所谓的后项引用了。当然,\2,\3的内容相信也就不言而喻了。

扩展的正则表达式

命令:egrep  =  grep -E

格式:egrep [OPTIONS] PATTERN [FILE...]

扩展的正则表达式与正则表达式的元字符大致一样。为什么叫他扩展的正则表达式呢?因为在扩展正则表达式中,除了词首词尾锚定和后项引用以外,其他的元字符都可以直接引用,不需要加“\”转义。

小练习

讲了这么多东西,我们来做一些题练练手吧~提供的答案仅为参考,因为不同的解题思路,你的解题步骤也会有所不同喏,小伙伴们尽情发挥吧(〃'▽'〃)

1、统计当前连接本机的每个远程主机IP的连接数,并按从大到小排序

netstat -tun |grep "[0-9]" |tr -s " " ":" |cut -d: -f6 |sort |uniq -c |sort -n

2、显示/etc/passwd文件中不以/bin/bash结尾的行

cat /etc/passwd | grep -v /bin/bash$

3、找出/etc/passwd中的两位或三位数

cat /etc/passwd |grep "\b[0-9]\{2,3\}\b"

4、显示CentOS7的/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面存非空白字符的行

cat /etc/grub2.cfg |grep "^[[:space:]]\+[^[:space:]].*$"

5、 使用egrep取出/etc/rc.d/init.d/functions中其基名

echo /etc/rc.d/init.d/functions | egrep -o "[^/]+/?$"

6、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行

cat /etc/rc.d/init.d/functions |egrep "^.*[^[:space:]]\(\)"

7、统计last命令中以root登录的每个主机IP地址登录次数

last |grep ^root |egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}" |sort |uniq -c

8、显示ifconfig命令结果中所有IPv4地址

ifconfig | egrep -o "\<(([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])\>"

9、显示三个用户root、mage、wang的UID和默认shell

cat /etc/passwd |egrep "^(root|mage|wang)\b" |cut -d: -f3,7

10、只利用df、grep和sort,取出磁盘各分区利用率,并从大到小排序

df |grep sd |grep -Eo "[0-9]{1,3}%" |sort -nr

Linux命令-文件文本操作grep  http://www.linuxidc.com/Linux/2015-12/126259.htm

grep正则表达式 http://www.linuxidc.com/Linux/2015-09/123035.htm

Linux中正则表达式与文件格式化处理命令(awk/grep/sed) http://www.linuxidc.com/Linux/2013-03/81018.htm

Linux基础之grep和正则表达式 http://www.linuxidc.com/Linux/2016-10/136250.htm

14 个 grep 命令的例子 http://www.linuxidc.com/Linux/2015-05/117626.htm

Linux文本处理工具grep和正则表达式及egrep与grep区别  http://www.linuxidc.com/Linux/2016-08/134046.htm

Linux基础之-正则表达式(grep,sed,awk)  http://www.linuxidc.com/Linux/2017-05/144221.htm

Linux文本处理工具及grep  http://www.linuxidc.com/Linux/2017-03/142277.htm 

grep命令中文手册(info grep翻译)  http://www.linuxidc.com/Linux/2017-09/146645.htm

grep 命令系列:如何在 UNIX 中根据文件内容查找文件 http://www.linuxidc.com/Linux/2016-01/128017.htm

:http://www.linuxidc.com/Linux/2017-09/146932.htm


推荐阅读
  • python第一天学习python
    1、python语言可使用的开发工具有:charles、fiddles等。。。2、语言分类:编译型和解释型,编译型如:c、c++、c#。。。。解释型:python、java、php ... [详细]
  • Java类加载详解(类的生命周期)
    https:www.cnblogs.comjhxxbp10900405.html类从被加载到虚拟机内存开始,到卸载出内存为止。解析阶段在某些情况下可以在初始化后再 ... [详细]
  • 经过一段时间的学习与实践,我已经使用D3.js完成了一些项目。鉴于中文D3教程稀缺,而英文资料虽丰富却对英语水平有一定要求,特此撰写一系列D3实战文章,旨在通过具体案例(如统计数据可视化、地图信息展示等)分享D3的使用技巧,促进技术交流。 ... [详细]
  • 本文介绍如何使用 Google 开发的 libphonenumber 库在 Java 应用中实现电话号码的有效性验证。该库不仅支持多种国际电话号码的格式化与解析,还提供了一系列强大的验证工具。 ... [详细]
  • 使用LINQ优化WinForms中CheckedListBox的操作
    本文介绍如何利用LINQ扩展方法解决WinForms中CheckedListBox控件的常见操作问题,包括获取选中项的文本并用分隔符连接,以及根据字符串初始化选中状态。 ... [详细]
  • CSV 文件的存取
    CSV文件介绍CSV(Comma-SeparatedValues),中文通常叫做逗号分割值。CSV文件由任意数目的记录(行& ... [详细]
  • 如何获取php脚本路径(2023年最新解答)
    如何获取php脚本路径(2023年最新解答) ... [详细]
  • Hibernate入门指南:单表数据库操作详解
    本文介绍了Hibernate作为全面的ORM框架的基础知识,并详细讲解了在MyEclipse环境中配置Hibernate以及进行基本的数据库单表操作的方法,包括增删改查等常见操作。 ... [详细]
  • Firefox 实现正则表达式作为函数调用的非标准扩展
    Firefox 引入了一项非标准的 JavaScript 扩展,允许正则表达式像普通函数一样被调用,从而简化了正则表达式的使用。这项特性在早期曾考虑纳入 ECMAScript 4 标准,但最终未能成行。 ... [详细]
  • ANSI最全介绍linux终端字体改变颜色等ANSI转义序列维基百科,自由的百科全书由于国内不能访问wiki而且国内关于ANSI的介绍都是简短的不能达到,不够完整所以转wiki到此 ... [详细]
  • 深入探讨Web服务器与动态语言的交互机制:CGI、FastCGI与PHP-FPM
    本文详细解析了Web服务器(如Apache、Nginx等)与动态语言(如PHP)之间通过CGI、FastCGI及PHP-FPM进行交互的具体过程,旨在帮助开发者更好地理解这些技术背后的原理。 ... [详细]
  • BeautifulSoup4 是一个功能强大的HTML和XML解析库,它能够帮助开发者轻松地从网页中提取信息。本文将介绍BeautifulSoup4的基本功能、安装方法、与其他解析工具的对比以及简单的使用示例。 ... [详细]
  • 7000字文章一键排版技巧与实践
    本文探讨了一种高效的文章排版方法,特别适合文字密集型内容,如原创公众号文章。作者通过个人经历,分享了从学习Markdown到利用mdnice实现一键排版的过程,旨在帮助更多内容创作者提升工作效率。 ... [详细]
  • 【Java数据结构和算法】008栈
    目录0、警醒自己一、栈的应用场景和介绍1、栈的应用场景一个实际的场景:我的思考:2、栈的介绍入栈演示图:出栈演示图 ... [详细]
  • 前端技术分享——利用Canvas绘制鼠标轨迹
    作为一名前端开发者,我已经积累了Vue、React、正则表达式、算法以及小程序等方面的技能,但Canvas一直是我的盲区。因此,我在2018年为自己设定了一个新的学习目标:掌握Canvas,特别是如何使用它来创建CSS3难以实现的动态效果。 ... [详细]
author-avatar
dfadsgafg4
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有