文本三剑客----grep与正则表达式

it2022-12-27  81

文章目录

一. grep文本过滤1.grep命令选项 二. 正则表达式1. 概念2.基本正则表达式元字符3. 匹配次数4. 位置锚定5. 分组 三. 扩展正则表达式(不用加斜线的)练习

一. grep文本过滤

grep, egrep, fgrep(不支持正则表达式搜索) grep: Global search REgular expression and Print out the line 作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检 查;打印匹配到的行 模式:由正则表达式字符及文本字符所编写的过滤条件 grep [OPTIONS] PATTERN [FILE…]

grep root /etc/passwd grep "$USER" /etc/passwd grep '$USER' /etc/passwd grep `whoami` /etc/passwd

1.grep命令选项

--color=auto: 对匹配到的文本着色显示 -m # 匹配#次后停止 -v 显示不被pattern匹配到的行 -i 忽略字符大小写 -n 显示匹配的行号 -c 统计匹配的行数 -o 仅显示匹配到的字符串 -q 静默模式,不输出任何信息 -A # after, 后#行 -B # before, 前#行 -C # context, 前后各#行 -e 实现多个选项间的逻辑or关系 grep –e ‘cat ’ -e ‘dog’ file -w 匹配整个单词(单词包括: 和 - 不包括 “ ”) -E 使用ERE -F 相当于fgrep,不支持正则表达式 -f file 根据模式文件处理

二. 正则表达式

1. 概念

REGEXP: Regular Expressions,由一类特殊字符及文本字符所编写的模式, 其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能 程序支持:grep,sed,awk,vim, less,nginx,varnish等 分两类: 基本正则表达式:BRE 扩展正则表达式:ERE grep -E相当于egrep 正则表达式引擎: 采用不同算法,检查处理正则表达式的软件模块 PCRE(Perl Compatible Regular Expressions) 元字符分类:字符匹配、匹配次数、位置锚定、分组

2.基本正则表达式元字符

字符匹配:

一个[ ]表示所有 两个[[ ]]表示一个 如:[[:lower:]]* 表示小写字母出现任意次

. 匹配任意单个字符 [] 匹配指定范围内的任意单个字符,示例:[wang] [0-9] [a-z] [a-zA-Z] [^] 匹配指定范围外的任意单个字符 [:alnum:] 字母和数字 [:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z [:lower:] 小写字母 [:upper:] 大写字母 [:blank:] 空白字符(空格和制表符) [:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广) [:cntrl:] 不可打印的控制字符(退格、删除、警铃...) [:digit:] 十进制数字 [:xdigit:]十六进制数字 [:graph:] 可打印的非空白字符 [:print:] 可打印字符 [:punct:] 标点符号

3. 匹配次数

用在要指定次数的字符后面,用于指定前面的字符要出现的次数 * 匹配前面的字符任意次,包括0次 贪婪模式:尽可能长的匹配 .* 任意长度的任意字符 \? 匹配其前面的字符0或1次 \+ 匹配其前面的字符至少1次 \{n\} 匹配前面的字符n次 \{m,n\} 匹配前面的字符至少m次,至多n次 \{,n\} 匹配前面的字符至多n次 \{n,\} 匹配前面的字符至少n次

4. 位置锚定

定位出现的位置 ^ 行首锚定,用于模式的最左侧 $ 行尾锚定,用于模式的最右侧 ^PATTERN$ 用于模式匹配整行 ^$ 空行 ^[[:space:]]*$ 空白行 \< 或 \b 词首锚定,用于单词模式的左侧 \> 或 \b 词尾锚定,用于单词模式的右侧 \<PATTERN\> 匹配整个单词

5. 分组

\(\) 将一个或多个字符捆绑在一起,当作一个整体处理,如:(root)+ 分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些 变量的命名方式为: \1, \2, \3, … \1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符 示例: (string1(string2)) \1 :string1(string2) \2 :string2 后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身

或者:\|

a\|b a或b C\|cat C或cat \(C\|c\)at Cat或cat

三. 扩展正则表达式(不用加斜线的)

. 任意单个字符 [] 指定范围的字符 [^] 不在指定范围的字符 * 匹配前面字符任意次 ? 0或1次 + 1次或多次 {m} 匹配m次 {m,n} 至少m,至多n次 位置锚定: ^ 行首 $ 行尾 \<, \b 语首 \>, \b 语尾 分组: () 后向引用:\1, \2, ... 或者: a|b a或b C|cat C或cat (C|c)at Cat或cat

练习

1、显示/proc/meminfo文件中以大小s开头的行(要求:使用两种方法)

grep "^\(S\|s\)" /proc/meminfo grep -E "^(S|s)".* /proc/meminfo

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

grep -v ".*:/bin/bash$" /etc/passwd

3、显示用户rpc默认的shell程序

grep ^rpc:.* /etc/passwd|cut -d: -f7

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

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

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

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

6、找出“netstat -tan”命令结果中以LISTEN后跟任意多个空白字符结尾的行

netstat -tan|grep ".*LISTEN[[:space:]]\+"

7、显示CentOS7上所有UID小于1000以内的用户名和UID

getent passwd|cut -d: -f1,3|grep -v ".*:[0-9]\{4,\}"

8、添加用户bash、testbash、basher、sh、nologin(其shell为/sbin/nologin),找 出/etc/passwd用户名和shell同名的行

\1$后向引用前面的(加词首锚定)

9、利用df和grep,取出磁盘各分区利用率,并从大到小排序 1、显示三个用户root、mage、wang的UID和默认shell

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

3、使用egrep取出/etc/rc.d/init.d/functions中其基名 4、使用egrep取出上面路径的目录名

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

6、利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255 7、显示ifconfig命令结果中所有IPv4地址 8、将此字符串:welcome to magedu linux 中的每个字符去重并排序,重复次数多的排到前面

最新回复(0)