文件内容查找grep正则表达式

Posted

tags:

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

功能:输入文件的每一行中查找字符串。并把匹配的行打印出来。

grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到屏幕,不影响原文件内容。

grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。

grep -[acinvo] '搜索内容串' filename

1.对文本进行行过滤

-v--对其匹配到的行取反

-i--忽略大小写

-n 显示匹配到的行号

-c 匹配的行数

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

-q 静默 不输出任何信息 echo $? ——> 0 1

-W 匹配整个单词               ----   单词不能接数字、字母、汉字、下划线(_ 否则不能算完整单词

 -A,B,C后面数字

 

2.元字符分类:字符匹配、匹配次数、位置锚定、分组

 字符匹配:

 .  匹配任意单个字符

[]  匹配指定范围内的任意单个字符   [ ]内字符不用转义如. /    

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

[:alnum:] 字母和数字

[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z

[:lower:] 小写字母

[:upper:] 大写字母

[:blank:] 空白字符(空格和制表符)

[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)

[:cntrl:] 不可打印的控制字符(退格、删除、警铃...

[:digit:] 十进制数字 [:xdigit:]十六进制数字

[:graph:] 可打印的非空白字符

[:print:] 可打印字符

[:punct:] 标点符号

 

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

* 匹配前面的字符任意次,包括0 贪婪模式:尽可能长的匹配

.* 任意长度的任意字符

\? 匹配其前面的字符01

\+ 匹配其前面的字符至少1

\{n\} 匹配前面的字符n

\{m,n\} 匹配前面的字符至少m次,至多n

\{,n\} 匹配前面的字符至多n

\{n,\} 匹配前面的字符至少n

 

位置锚定:定位出现的位置

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

 $ 行尾锚定,用于模式的最右侧 ^PATTERN$  用于模式匹配整行

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

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

  \> \b 词尾锚定;用于单词模式的右侧 \<PATTERN\> 匹配整个单词

 

 分组:

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

 分组括号中的模式匹配到的内容会被正则表达式引擎记录于 内部的变量中,这些变量的命名方式为: \1, \2, \3, ... v\1 表示从左侧起第一个左括号以及与之匹配右括号之间的 模式所匹配到的字符 v 示例: \(string1\+\(string2\)*\) \1                       string1\+\(string2\)* \2 string2 v

后向引用:引用前面的分组括号中的模式所匹配字符,而非 模式本身 v 或者:\| 示例:a\|b: ab  C\|cat: Ccat   \(C\|c\)at:Catcat

这里列出几个扩展特殊符号:

+,于 . * 作用类似,表示 一个或多个重复字符。

? . * 作用类似,表示0个或一个字符。

|,表示或关系,比如 'gd|good|dog' 表示有gd,gooddog的串

(),将部分内容合成一个单元组。比如 要搜索 glad good 可以这样 'g(la|oo)d'

()的好处是可以对小组使用 + ? * 等。

比如要搜索AC开头结尾,中间有至少一个(xyz) 的串,可以这样 : 'A(xyz)+C'

 

示例

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

[[email protected] ~]# egrep -i ^[s]  /proc/meminfo

egrep "^[sS]" /proc/meminfo

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

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

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

[[email protected] ~]#grep "\<[[:digit:]]\{2,3\}\>" /etc/passwd

egrep "[0-9]{2,3}\>" /etc/passwd

4.显示用户rpc默认的shell程序

[[email protected] ~]# cat /etc/passwd |egrep "\<rpc\>" |cut -d: -f7

                                   grep -w "^rpc" /etc/passwd |cut -d: -f7

                                   grep "^rpc\>" /etc/passwd |cut -d: -f7

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

 [[email protected] ~]# egrep  "^[[:space:]]{1,}[^[:space:]"] /etc/grub2.cfg

[[email protected] ~]# egrep  "^[[:space:]]+[^[:space:]]" /etc/grub2.cfg

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

netstat -tan | grep "\(LISTEN\)\[[:space:]]*$"

[[email protected] ~]# netstat  -tan |egrep "(LISTEN)[[:space:]]*$"

7.显示CentOS7上所有系统用户的用户名和UID

[[email protected] ~]# cat /etc/passwd|egrep "\<[0-9]{1,3}\>"|cut -d: -f1,3

注:在centos7上系统用户的uid0-999

[[email protected] ~]# cat /etc/passwd|egrep "\<[0-9]{1,3}\>"|cut -d: -f1,3

[[email protected] ~]# cut -d: -f1,3 /etc/passwd |egrep "\<[[:digit:]]{1,3}$"

8.添加用户bashtestbashbashershnologin(shell /sbin/nologin),找出/etc/passwd用户名同shell名的行

[[email protected] ~]# cat /etc/passwd |egrep "^([[:alnum:]]+\>).*\1$"

[[email protected] ~]# cat /etc/passwd |egrep "^([a-zA-Z]+\>).*\1$" shell类型只含字母

9.利用dfgrep,取出磁盘各分区利用率,并从大到小排序

[[email protected] ~]# df -h |egrep "^/dev/sda" |egrep -o "([0-9]{,2}|100)%"

[[email protected] ~]# df |grep "^/dev/sd" | grep -o "\<[[:digit:]]\+%" |sort -nr|tr -d "%"

10.显示三个用户rootmagewangUID和默认shell默认shell

[[email protected] ~]# cat /etc/passwd |egrep "^(mage|wang|root)\>"|cut -d: -f1,7

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

[[email protected] ~]# cat /etc/rc.d/init.d/functions|egrep "^[[:alnum:]|_]{1,}\(\)"

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

[[email protected] ~]# echo /etc/rc.d/init.d/functions|egrep -o "[^/]+$"

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

 [[email protected] ~]# echo /etc/rc.d/init.d/functions|egrep -o "^/.*/\<"

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

[[email protected] ~]# last|egrep -w "root"|egrep "([0-9]{1,3}\.){3}[0-9]{1,3}"|tr -s ' '|cut -d' ' -f1,3|sort |uniq -c

15.利用扩展正则表达式分别表示0-910-99100-199 200-249250-255 v

[0-9]                      [1-9][0-9]     1[0-9][0-9]    2[0-4][0-9]  25[0-5]   

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

[[email protected] ~]# 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])\>"

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

[[email protected] ~]# echo "welcome to  magedu linux" |egrep -o "." |sort |uniq -c

18.用正则表达式表示手机号11 13 17 15 18

[[email protected] ~]# egrep "1[3758][0-9]{9}"

 

 


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

07 grep命令与正则表达式

4-18 Linux中搜索文件的内容 --- grep

shell脚本之正则表达式

[转] Linux 查找文件内容

正则介绍grep

Linux里如何查找文件内容