Linux学习(二十三)正则表达式(一)grep/egrep

一、概述

正则表达式是运维工作中经常需要用到的知识。文件查找,日志分析,rewrite规则,shell脚本等等,都需要正则表达式的知识。那么什么是正则表达式呢?我的理解就是,按照一定的规则找到或者替换你需要的字符串,这个规则就是正则表达式,准确的讲,它就是一个规则。使用正则表达式的命令有很多,我们今天讲到的grep和egrep就是最常用的。此外还有sed、awk,我们会在后续接着讲到。

二、grep/egrep

egrep是grep的增强版,grep能实现的egrep都能实现,而且在某些地方,使用egrep更加方便。下面就具体讲一下这两个命令。

语法: grep  [-cinvABC]  ‘word‘  filename

-c :打印符合要求的行数

-i :忽略大小写

-n :在输出符合要求的行的同时连同行号一起输出

-v :打印不符合要求的行

-A :后跟一个数字(有无空格都可以),例如 –A2则表示打印符合要求的行以及下面两行

-B :后跟一个数字,例如 –B2 则表示打印符合要求的行以及上面两行

-C :后跟一个数字,例如 –C2 则表示打印符合要求的行以及上下各两行

实验:

-c

[[email protected] test]$ grep -c ‘oo‘ a.txt
6

-i

[[email protected] test]$ grep --color -i ‘OO‘ a.txt
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin

--color选项的意思是高亮显示搜索到的内容:

-n

[[email protected] test]$ grep -n ‘oo‘ a.txt
1:root:x:0:0:root:/root:/bin/bash
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
11:operator:x:11:0:operator:/root:/sbin/nologin
21:postfix:x:89:89::/var/spool/postfix:/sbin/nologin

-v

[[email protected] test]$ grep -v ‘oo‘ a.txt|head -n 3
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

-A

[[email protected] test]$ grep -A2 -n ‘li\.jianlin‘ a.txt
93:li.jianlin:x:7202:7022::/home/li.jianlin:/bin/bash

因为93行是最后一行,所以只显示了折行

-B

[[email protected] test]$ grep -B2 -n ‘li\.jianlin‘ a.txt
91-wang.xishuai:x:7200:7022::/home/wang.xishuai:/bin/bash
92-han.xinyu:x:7201:7022::/home/han.xinyu:/bin/bash
93:li.jianlin:x:7202:7022::/home/li.jianlin:/bin/bash

-C

[[email protected] test]$ grep -C1 -n ‘xishuai‘ a.txt
90-xiong.zhengmao:x:7199:7022::/home/xiong.zhengmao:/bin/bash
91:wang.xishuai:x:7200:7022::/home/wang.xishuai:/bin/bash
92-han.xinyu:x:7201:7022::/home/han.xinyu:/bin/bash

特殊字符“.”

特殊字符.表示任意字符

[[email protected] test]$ grep --color ‘7.22‘ a.txt
mabg:x:7032:7022::/home/mabg:/bin/bash
zhongwt:x:7038:7022::/home/zhongwt:/bin/bash

.*表示任意数量的任意字符(可以包含空行)

[[email protected] test]$ grep ‘.*‘ a.txt|wc -l
93

可见使用.*查找到了所有的行。

?表示没有,或者有1个

[[email protected] test]$ grep "n?" a.txt
[[email protected]-zol-fss-web1 test]$ grep "n\?" a.txt|head -n3
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[[email protected]-zol-fss-web1 test]$ egrep ‘n?‘ a.txt|headn -n3
-bash: headn: command not found
[[email protected]-zol-fss-web1 test]$ egrep ‘n?‘ a.txt|head -n3
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

从上面的例子我们能发现,使用grep不能直接判断出特殊符号?,而需要转义,但是用egrep不需要转义。

除了?之外,egrep还支持+(表示一个或者多个):

[[email protected] test]$ grep ‘o+‘ a.txt|head -n3
[[email protected]-zol-fss-web1 test]$ egrep ‘o+‘ a.txt|head -n3
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[[email protected]-zol-fss-web1 test]$ grep ‘o\+‘ a.txt|head -n3
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

正则表达式中使用()来表示一个整体:

[[email protected] test]$ grep ‘(oo|ol)‘ a.txt
[[email protected]-zol-fss-web1 test]$ egrep ‘(oo|ol)‘ a.txt|head -n3
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

grep还可以在指定的文件或者目录中搜索相关的行:

[[email protected] test]$ grep -r --include=‘*.txt‘ ‘oo\+‘ ./
./a.txt:root:x:0:0:root:/root:/bin/bash
./a.txt:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
./a.txt:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
./a.txt:uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
./a.txt:operator:x:11:0:operator:/root:/sbin/nologin
./a.txt:postfix:x:89:89::/var/spool/postfix:/sbin/nologin

-r是递归搜索的意思,--include="*.txt"是指搜索.txt结尾的文件。注意使用grep的时候,如果正则里用到+号,需要转义。

时间: 2024-10-13 15:09:17

Linux学习(二十三)正则表达式(一)grep/egrep的相关文章

攻城狮在路上(叁)Linux(二十三)--- linux磁盘参数修改(设备代码、设备名)

一.mknod:设置设备代码 linux中,所有的设备都是用文件来表示,文件通过major与minor数值来判断. major为主设备代码,minor为设备代码(需要查询),示例如下: /dev/hda ---------major:3------minor:0~63 /dev/hdb----------major:3------minor:64~127 /dev/sda----------major:8------minor:0~15 ... 命令格式:mknod 设备名 [bcp] [maj

第五期 shell 正则表达式(grep egrep sed awk)(第十一 十二讲)

一.grep/egrep 1. 语法+选项语法: grep  [-cinvABC]  'word'  filename (尽量用单引号) ---color 打印出来用红色显示 alias cgrep='grep --color' vim ./bashrc -c :打印符合要求的行数-n :在输出符合要求的行的同时连同行号一起输出 -v :打印不符合要求的行 -A :后跟一个数字(有无空格都可以),例如 –A2则表示打印符合要求的行以及下面两行 -B :后跟一个数字,例如 –B2 则表示打印符合要

RHCE7学习笔记16——正则表达式的grep使用

一.通配符 [ ]:匹配中括号里面的一个字符: 表示字母[a-z],[0-9]表示数字, 括号里面的 ^ 表示否,等同于!,如[^a-z],[!0-9] \:转义字符:[a\-z] ?:匹配任意一个字符: *:0个或者任意多个字符: 类字符: [[:upper:]] [[:lower:]] [[:digit:]] [[:alpha:]] [[:alnum:]] [[:blank:]] yum是shell的子进程,如果在shell直接使用yum install xysfedfs*,则先会在shel

Shell编程之正则表达式三剑客——grep,egrep

正则表达式概述 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑. 基础正则表达式 正则表达式的字符串表达方法根据不同的严谨程度与功能分为基本正则表达式与扩展正则表达式.基础正则表达式是常用的正则表达式的最基础的部分.在 Linux 系统中常见的文件处理工具中 grep 与 sed 支持基础正则表达式,而 egrep 与 awk 支持扩展正则表达式.

Linux学习-shell利用正则表达式验证邮箱合法性

引文:在今天这个时代,Email已经成为一种重要的通信方式.给导师发邮件,学术研究之间的交流,etc.常常用到Email,然而Email的验证却有点小难度,下面给出一个在Linux下使用shell脚本编写的一个实例. linux中将正则表达式和sed.gawk结合起来,功能非常强大.我说的是真的,没骗你的,好好学吧. 邮箱验证 Email地址的基本格式为: username@hostname 1.username部分模式匹配 username的值可以用字符数子字符以及以下特殊字符: 点号 单破折

Linux学习笔记之正则表达式

不积跬步无以至千里,不积小流无以成江海    --荀子<劝学篇>   不管是看Linux书籍还是视频教程都有说正则表达式相当重要,正确运用正则表达式能够帮助管理系统是减少很多的工作量.实际上,正则表达式是一种处理字符串的方法,通过一些特殊符号的辅助,让用户轻易达到查找.删除.替换特定字符串.可以说,它是Linux基础当中的基础,学完之后一定会大有增益. 一.通配符和正则表达式的区别: 通配符只是bash接口中的一个功能,而正则表达式则是一种字符串处理的表示方式:学习正则表达式之前一定要将bas

linux 学习基础4正则表达式

grep 根据模式来搜索文本文件 并将符合模式的行显示出来  grep [options] 模式 FILE 选项 -i  ignore case忽略字符大小写 --colour 用颜色标记被匹配到的字符 -o  只显示被匹配到行 -v  只显示被匹配到的行之外的行 -A number  显示被匹配到行的下面多少行 -B number  显示被匹配到行上面多少行 -C number  显示被匹配到的行上 下 个多少行 -E <=> egrep 扩展的正则表达式 正则表达式的元字符介绍 1 次数匹

Linux学习-09-学习正则表达式-1

grep进阶 截取:dmesg(列出讯息) |grep '内容' -A 后面加数字 after 后面几行 -B 后面加数字 befor后面几行 寻找regular_express.txt 中的'the'行 cat regular_express.txt |grep 'the' grep 'the' regular_express.txt grep -nv (加行号,反选)'the' regular_express.txt grep -ni (加行号,不区分大小写)'the' regular_ex

Linux学习 -- Shell编程 -- 正则表达式

正则表达式与通配符 正则 -- 匹配字符串 -- 包含匹配     grep.awk.sed等 通配符 -- 匹配文件名 -- 完全匹配  ls.find.cp等 基础正则表达式

Linux命令(二十三) 磁盘管理命令(一) df,du,tune2fs

一. 查看磁盘占用空间情况 df df 命令用于查看硬盘空间的使用情况,还可以查看硬盘分区的类型或 inode 节点的使用情况等. df 命令常用参数如下: -a 显示所有文件系统的磁盘使用情况,包括0块(block)的文件系统,如 /proc 文件系统 -k 以 k 字节为单位显示 -i 显示 i 节点信息,而不是磁盘块 -t 显示各指定类型的文件系统的磁盘空间使用情况 -x 列出不是某一指定类型文件系统的磁盘空间的使用情况(与 t 选项相反) -T 显示文件系统类型 df 命令使用实例: 查