正则和grep——再做正则就去死

grep 文本过滤工具
  • 基本正则表达式
    • grep 语法
    • 基本正则表达式的元字符
    • 次数匹配
    • 位置锚定
    • 分组
  • 扩展正则表达式
    • 基本正则表达式的元字符
    • 次数匹配
    • 位置锚定
    • 分组
    • 或者
  1. grep的介绍
  2. linux上文本处理三剑客 grep:文本过滤(模式:pattern)作用: 把匹配到的行给予显示,没匹配到的行过滤掉。

模式:由正则表达式字符及文本字符所编写的过滤条件:

REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符不表示字符字面意义,而表示控制或匹配的功能:

分两类:

基本正则表达式:BRE

扩展正则表达式:ERE

grep -E,egrep (用来支持扩展正则表达式)

正则表达式引擎:

grep [OPTIONS] PATTERN [FILE...]

grep语法选项:

参数 作用
--color=auto 对匹配到的文本着色显示
-v 显示能被正则匹配到的行
-E 使用扩展正则表达式
-o 仅显示匹配到的内容
-q 不显示执行结果(静默模式)
-A n 显示匹配到的内容和指定的后面n行。
-B n 显示匹配到的内容和指定的前面n行。
-C n 显示匹配到的内容和指定的前后面n行。
-G n 使用基本正则表达式
-f 使用固定字符串
-p 使用perl的正则表达式

基本正则表达式元字符 字符匹配

参数 作用
. 匹配任意单个字符
[] 匹配任意范围内单个字符
[^] 匹配指定范围外的任意单个字符
[:alnum:] 任意字母和数字
[:alpha:] 任意大小写字母
[:lower:] 任意小写字母
[:upper:] 任意大写字母
[:blank:] 空白字符[空格和制表符]
[:space:] 水平和垂直的空白字符比blank更广
[:digit:] 任意十进制数字

[:digit:]|任意十六进制数字 [:punct:] |标点符号 [alex] | 匹配a,l,e,x这个四个字母

次数匹配

*:任意长度的任意字符:
例:grep 'a.*y' grep.txt
\?:匹配其前面的字符0或1次:即前面的可有可无:
例:grep 'x\?y' grep.txt
\+:匹配其前面的字符至少一次:
例:grep 'x\+y' grep.txt
例:grep "xy\+" grep.txt
\{m\}:匹配前面的字符m次
例:grep '[[:alpha:]]'\[3\]t' /etc/passwd
\{m,n\}:匹配前面的字符至少m次,至多n次。
例:grep '[:alpha:]' \[1,3]\ /etc/passwd
\{0,n\}:匹配前面的字符至多n次:
|{m,\}:匹配前面的字符至少m次。

位置锚定

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

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

^PATTERN$:用于模式匹配整行:

^$:空行:

^[[:space:]]*$  空格行

\< 或 \b 词首锚定:用于单词模式的左侧
例:grep '\<[[:alpha:]]\[1,3\]t' /etc/passwd \> 或 \b 词尾锚定:用于单词模式的右侧
例:grep '[[:alpha:]]\[1,3\]t\>' /etc/passwd \<pattern>:匹配整个单词。

分组

分组:\(\)将一个或多个字符捆绑在一起,当做一个整体进行处理,如:\(root\)\+

例:grep '\([[:alpha:]]\{1,3}t\>\).*\1' /etc/passwd

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

\1表示从左侧器第一个左括号以及与之匹配右括号之间的模式所匹配到的字符

示例:   \(string1\+\(string2\))
\1: string1\+\(string2)*
\2:string2 例:grep "\(r..t).*\1" /etc/passwd # 表示前面r..t匹配到什么内容,\1页必须匹配相对应的字符。 例:useradd ruut -c buuh -s /bin/bu
grep "\(r..t\).*(b..h\).*\1.*\2" /etc/passwd 后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身
egrep = grep -E

egrep [OPTIONS][ATTERN [FILE...]

扩展正则表达式的元字符:
字符匹配:
. 任意单个字符
[] 指定范围的字符
[^] 不在指定范围的字符 次数匹配 ;
*: 匹配前面字符任意次
?: 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开头的行:(要求:使用两种方式)

egrep '^[sS]' /proc/meminfo

egrep -i ^'s' /proc/meminfo

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

egrep -v "/bin/bash"$  /etc/passwd

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

egrep '^rpc\>' /etc/passwd |cut -d: -f7

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

egrep "[[:digit:]]{2,3}" /etc/passwd

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

egrep "^[[:space:]]+[^[:space:]]+" /etc/grubu.cfg

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

netstat -tan | egrep "LISTEN[[:space:]]*$"

7、显示centos7上所有系统用户的用户名和UID

cut -d: -f1,3 /etc/passwd | egrep "[1-9]{1,3}$"

8、找出/etc/passwd用户名同shell名的行

egrep "^(.*):.*\1$" /etc/passwd

9、利用df和egrep,取出磁盘各分区利用率,并从大到小排序

df -h | egrep -o "[[:digit:]]{1,2}%" | cut -d% -f1 |sort -r

10、显示三个用户root、alex、wang的UID和默认shell

egrep "^(root|alex|wang)\>" /etc/passwd | cut -d: -f3,7

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

egrep -o ^"[_[:alpha:]]+\(\)" /etc/rc.d/init.d/functions

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

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

13、使用egrep取出上面的路径的目录名。

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

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

last | egrep -o "^root\>.*[0-9]\.[0-9]{1,3}" |tr -s " " "%"|cut -d% -f3

15、利用扩展正则表达式分别表示0-9 、10-99 、100-199、200-249 、250-255

看不懂要求

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

ifconfig  | egrep  -o "([0-9]{1,3}\.){3}[0-9]{1,3}"
#未去除172 255之类IP

17、将此字符串:welcome to oldboy python 中的每个字符去重并排序,重复次数多的排到前面

echo "welcome to  oldboy python" | egrep -o  "[[:alpha:]]" | sort  | uniq -c | sort -nr
上一篇:C# 季节判断


下一篇:编写shell管理脚本(一)