Linuxgrep和正则表达

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linuxgrep和正则表达相关的知识,希望对你有一定的参考价值。

一、什么是正则表达式

正则表达式就是为了处理大量的文本|字符串而定义的一套规则和方法
它主要用于字符串的模式分割、匹配、查找及替换操作,其中最为重要作用是匹配。
在Linux系统中最常用正则表达式的命令是grep(egrep),sed,awk

二、正则表达式与通配符

正则表达式分为两类:
基本正则表达式:BRE
扩展正则表达式:ERE
grep 工具支持基本正则表达式,egrep支持扩展正则表达式,并且grep的-E选项其实就是egrep
grep语法
grep [OPTIONS]VPATTERN [FILE...] 这里只列出了几个常用的选项
--color 高亮显示匹配到的字符(centos7默认开启,centos6里需手动添加,可以添加别名便于过滤匹配
alias egrep =‘egrep --color=auto‘
alias grep =‘grep --color=auto‘)
-v 反向搜索
-i 忽略大小写
-n 显示行号
-c 不显示搜索结果,仅显示匹配的行数
-o 仅显示匹配到的字符串
-q 静默输出
-A # 显示搜索行及其向下相临的#行
-B # 显示搜索行及其向上相临的#行
-C # 显示搜索行及其向上和向下相临的#行
-e char1 -e char2 [-e charN] 多个选项间or关系
-w 匹配整个单词
-E 或egrep 支持扩展正则表达式
-F 或fgrep 不支持正则表达式
字符匹配

  1. 通配符
元字符 作用
* 匹配0个或任意多个字符,也就是可以匹配任何内容
表示任意一个单一字符
[ ] 匹配[ ]中任意一个字符
[-] 匹配括号中任意一个字符,-代表一个范围,例如:[a-z]代表匹配一个小写字母
[^] 逻辑非,表示匹配不是中括号内的一个字符,例如[^0-9]代表匹配一个不是数字的字符

2.基础正则表达式

元字符 作用
* 前一个字符匹配0次或任意多次,匹配0次前一个字符则表示匹配任意字符,包括空白行反倒是
. 匹配除了换行符以外任意一个字符,“.”匹配所有内容
^ 用于指定匹配字符串的头部,也称行首定位符;匹配行首。例如:^hello会匹配以hello开头的行,grep -n “^$” test.txt匹配空白行并显示行号
$ 用于指定匹配字符串的尾部,也称行尾定位符;匹配行尾。例如:hello$会匹配以hello结尾的行
[ ] 匹配中括号中指定的任意一个字符,只匹配一个字符,要匹配[则要转义[
[^] 匹配除中括号的字符以外的任意一个字符
|转义符用于取消特殊符号的含义,匹配包含以.结尾的行grep “.$” test.txt
{n} 表示其前面的字符恰好出现n次。例如:[0-9]{4}匹配4位数字,但注意添加两边的定界符,以精确匹配
{n,} 表示其前面的字符出现不小于n次。例如:[0-9]{2,}匹配2位以上的数字
{n,m} 表示其前面的字符至少出现n次,最多出现m次。例如:[a-z]{6,8}匹配6到8位的小写字母

这里我们要注意的是“?”“()”是扩展正则的元字符,在正则表达式中使用这些元字符如[ ]、{}、?、()、.等要在这些元字符前加“\”转义。

3.字符类

元字符 作用
[0-9] 表示数字范围
[a-Z] 表示所有字母
[mage] 表示包含m或a或g或e
[^mage] 表示不包含m或a或g或e
[:digit:] 表示任意数字
[:upper:] 表示大写字母
[:lower:] 表示小写字母
[:alpha:] 表示任意字母包含大小写
[:alnum:] 表示任意字母或数字
[:space:] 表示空格或换行
[:blank:] 表示空格
[:punct:] 表示符号

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


\<
```或`\b`:词首锚定,用户单词模式的左侧

`\>`或`\b`:词尾锚定,用于单词模式的左侧
\<PATTERN\>:匹配整个单词
分组:\(\)将一个或多个字符捆绑在一起,当做一个整体进行处理,如:\(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

练习:
1、显示/proc/meminfo文件中以大小s开头的行(要求:使用两种方法)
    cat /proc/meminfo |grep "^s\|S"
    cat /proc/meminfo |grep -i ^s
    grep ^[sS] /proc/meminfo
    grep -e ^s -e ^S /proc/meminfo

2、显示/etc/passwd文件中不以/bin/bash结尾的行
    cat /etc/passwd  |grep -v "/bin/bash$"

3、显示用户rpc默认的shell程序
    grep -w "^rpc" /etc/passwd |cut -d: -f7

4、找出/etc/passwd中的两位或三位数
    cat /etc/passwd | grep  -o "\<[[:digit:]]\{2,3\}\>"

5、显示CentOS7的/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面存非空白字符的行
    cat /etc/grub2.cfg | grep "^[[:space:]]\+[^[:space:]]"

6、找出“netstat -tan”命令的结果中以‘LISTEN’后跟任意多个空白字符结尾的行
    netstat -tan | grep "LISTEN[[:space:]]\+$"

7、显示CentOS7上所有系统用户的用户名和UID
    cat /etc/passwd |cut -d: -f1,3 | grep "\<[0-9]\{1,3\}\>"

8、添加用户bash、testbash、basher、sh、nologin(其shell为/sbin/nologin),找出/etc/passwd用户名同shell名的行
    cat /etc/passwd | grep "\(^.*\)\>.*\<\1$"

9、利用df和grep,取出磁盘各分区利用率,并从大到小排序
     df | grep -o "[0-9]\{1,3\}%" | grep -o "[0-9]\+" | sort -nr
     df |grep "^/dev/sd" |grep -o "[[:digit:]]\{1,3\}%" |tr -d % |sort -nr

# 三、扩展正则表达式
3.扩展正则表达式

|元字符 | 作用 |  
| -------- | -------- |
| ()     |小括号,可以将正则字符和元字符或表达式进行组合,”(book管道符desk)s”将匹配”books”或”desks”    
|?|问号,匹配0个或1个前导表达式,如”a?”匹配其他字符串或a
|\<|反斜杠+小于号,词首定位符, “\< abc”表示所有包含以”abc”开头的单词的行
|\>|反斜杠+大于号,词尾定位符, “\>abc”表示所有包含以”abc”结尾的单词的行
|-|减号,用于指明字符范围, “[a-c]”将匹配包含a、b和c中任意一个字符的字符串
|+|加号,匹配一个或多个前导表达式,相当于 expr{1,}
管道符|,表示“或”,即匹配其中任何一个,”book|desk”将匹配”book”或”desk”
**练习**
1、显示三个用户root、mage、wang的UID和默认shell
    cat /etc/passwd |egrep "^(root|mage|wang)\>"|cut -d: -f3,7

2、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行
    egrep "^[_[:alnum:]]+\(\)" /etc/rc.d/init.d/functions

3、使用egrep取出/etc/rc.d/init.d/functions中其基名
    echo /etc/rc.d/init.d/functions |egrep -o "[^/]+$"

4、使用egrep取出上面路径的目录名
    echo /etc/rc.d/init.d/functions | egrep -o ".*/." |egrep -o ".*/"

5、统计last命令中以root登录的每个主机IP地址登录次数
    last |grep "^root\>" |egrep -o "([[:digit:]]{1,3}.){3}[[:digit:]]{1,3}" |sort -nr |uniq -c

6、利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255
    [0-9]
    [1-9][0-9]
    1[0-9]{2}
    2[0-4][0-9]
    25[0-5]

7、显示ifconfig命令结果中所有IPv4地址
    ifconfig | egrep "\<(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])" -o

8、将此字符串:welcome to  magedu linux 中的每个字符去重并排序,重复次数多的排到前面
    echo welcome to magedu linux | grep -o . | sort | uniq -c | sort -nr

以上是关于Linuxgrep和正则表达的主要内容,如果未能解决你的问题,请参考以下文章

通过 Java 正则表达式提取 semver 版本字符串的片段

linux grep命令详解

text 正则表达式片段

markdown 正则表达式模式片段

Linux grep命令的一些使用体会

正则表达式匹配特定的 URL 片段而不是所有其他 URL 可能性