加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

grep正则表达式

发布时间:2020-12-13 22:23:25 所属栏目:百科 来源:网络整理
导读:一、前言 grep是功能强大的文本处理工具,全称:global search regular expression and print out the line,grep一行一行使用正则表达式匹配文本,之后对匹配到的文本整行显示(除非使用特定的选项取反,如 grep -v)。 二、grep用法 grep命令用法: grep [


一、前言

grep是功能强大的文本处理工具,全称:global search regular expression and print out the line,grep一行一行使用正则表达式匹配文本,之后对匹配到的文本整行显示(除非使用特定的选项取反,如 grep -v)。


二、grep用法

grep命令用法:

grep [OPTIONS] PATTERN [FILE…]

grep [OPTIONS] [-e PATTERN | -f FILE] [FILE…]

为了使用grep用法,我们不得不先简单学习下正则表达式


2.1、正则表达式用法

首先,我们要明白什么是正则表达式?所谓正则表达式就是使用单个字符串来描述、匹配一系列符合某个语法规则的字符串。正则表达式由一些普通字符和元字符组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义。


2.1.1、基本正则表达式的元字符用法

a:字符匹配

. 匹配任意单个字符 例如:grep 'roo.' /etc/passwd
[] 匹配指定范围内的任意单个字符 例如:grep '[ro]' /etc/passwd
[^] 取反 例如:grep '[^ro]' /etc/passwd

b:次数匹配

* 匹配任意次数 例如: grep 'roo*' /etc/passwd
? 匹配其前面字符出现0或者1次 例如: grep 'roo?' /etc/passwd
{m} 匹配其前面字符出现m次 例如: grep 'ro{2}' /etc/passwd
{m,} 匹配其前面字符最少出现m次 例如: grep 'ro{2,}' /etc/passwd
{m,n} 匹配其前面字符最少出现m次,最多n次 例如: grep 'ro{2,3}' /etc/passwd
{0,n} 匹配其前面字符最多n次 例如: grep 'ro{0,2}' /etc/passwd

c:位置锚定匹配

^ 行首锚定符 例如:grep '^root' /etc/passwd
$ 行尾锚定符 例如:grep 'shell$' /etc/passwd
&; 词首锚定符 例如:grep '&;root' /etc/passwd
&; 词尾锚定符 例如:grep 'shell&;' /etc/passwd

d:分组

() 分组,分组中模式匹配的内容可被引用 例如:grep '(root).*1' /etc/passwd

e:引用

# 引用分组中第#个内容(#为数字) 例如:grep '(root).*1' /etc/passwd

2.1.2、扩展正则表达式的元字符用法

a:字符匹配

. 匹配任意单个字符 例如:egrep 'roo.' /etc/passwd
[] 匹配指定范围内的任意单个字符 例如:egrep '[ro]' /etc/passwd
[^] 取反 例如:egrep '[^ro]' /etc/passwd

b:次数匹配

* 匹配任意次数 例如: egrep 'roo*' /etc/passwd
+ 匹配前面字符出现1次以上 例如: egrep 'root' /etc/passwd
? 匹配其前面字符出现0或者1次 例如: egrep 'roo?' /etc/passwd
{m} 匹配其前面字符出现m次 例如: egrep 'ro{2}' /etc/passwd
{m,} 匹配其前面字符最少出现m次 例如: egrep 'ro{2,}' /etc/passwd
{m,n} 匹配其前面字符最少出现m次,最多n次 例如: egrep 'ro{2,3}' /etc/passwd
{0,n} 匹配其前面字符最多n次 例如: egrep 'ro{0,2}' /etc/passwd

c:位置锚定匹配

^ 行首锚定符 例如:egrep '^root' /etc/passwd
$ 行尾锚定符 例如:egrep 'shell$' /etc/passwd
&; 词首锚定符 例如:egrep '&;root' /etc/passwd
&; 词尾锚定符 例如:egrep 'shell&;' /etc/passwd

d:分组

( ) 分组,分组中模式匹配的内容可被引用 例如:egrep '(root).*1' /etc/passwd

e:或者

| 或者 例如: egrep 'bash|nologin' /etc/passwd

f:引用

number 引用第几个匹配 例如 grep '(12).*1' /etc/passwd

2.3 grep常用的选项

-v 反向选择 例如:grep -v 'root' /etc/passwd
-o 仅显示匹配的字符串本身,而非所在行 例如:grep -o 'root' /etc/passwd
-i 忽略大小写 例如:grep -i 'root' /etc/passwd
-E 支持使用扩展正则表达式 例如:grep -E '(root).*1' /etc/passwd
-A 后面n行 例如:grep -A 3 'root' /etc/passwd
-B 前面n行 例如:grep -B 3 'mysql' /etc/passwd
-C 前后各n行 例如:grep -C 3 'mysql' /etc/passwd

三、例题

3.1、显示/etc/passwd文件中以bash结尾的行

grep'&;bash&;$'/etc/passwd
root:x:0:0:root:/root:/bin/bash
leon:x:500:4400::/home/leon:/bin/bash
mandirva:x:2200:4400::/home/mandirva:/bin/bash
......
centos:x:2241:2241::/home/centos:/bin/bash
user1:x:2242:2242::/home/user1:/bin/bash

3.2、显示/etc/passwd文件中的两位数或三位数

grep'&;[[:digit:]]{2,3}&;'/etc/passwd
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
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTPUser:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
vcsa:x:69:69:virtualconsolememoryowner:/dev:/sbin/nologin
saslauth:x:499:76:"Saslauthduser":/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separatedSSH:/var/empty/sshd:/sbin/nologin
leon:x:500:4400::/home/leon:/bin/bash
openstack:x:501:501:This'sopenstack:/home/openstack:/bin/bash

3.3、显示`netstat -tan`命令结果中以‘LISTEN’后跟0个、1个或者多个空白字符结尾的行

netstat-tan|grep'LISTEN'[[:space:]]*
tcp000.0.0.0:220.0.0.0:*LISTEN
tcp00127.0.0.1:250.0.0.0:*LISTEN
tcp00:::22:::*LISTEN
tcp00::1:25:::*LISTEN

3.4、添加用户bash、testbash、basher以及nologin用户(nologin用户的shell为/sbin/nologin);而后找出/etc/passwd文件中用户名与其shell名相同的行

grep'^([[:alnum:]]*):.*1$'/etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
nologin:x:2208:2208::/home/nologin:/sbin/nologin

3.5、显示当前系统上root、centos或者user1用户的默认shell和UID (请事先创建这些用户,若不存在)

grep-E'^root|^centos|^user1'/etc/passwd|cut-d:-f1,3,7
root:0:/bin/bash
centos:2241:/bin/bash
user1:2242:/bin/bash

3.6、找出/etc/rc.d/init.d/functions文件中某单词(单词中间可以存在下划线)后面跟着一组小括号的行

grep-E'&;[[:alpha:]]+_?()'/etc/rc.d/init.d/functions
checkpid(){
daemon(){
killproc(){
pidfileofproc(){
pidofproc(){
status(){
success(){
failure(){
passed(){
warning(){
action(){
strstr(){
confirm(){

3.7、使用echo输出一个路径,而后egrep找出其路径基名;进一步的使用egrep取出其目录名

echo/etc/passwd|egrep-o'[[:alnum:]]+$'
passwd
echo/etc/passwd|egrep-o'^(/).*1'
/etc/

3.8、找出ifconfig命令执行结果中1-255之间的数字

ifconfig|grep-Eo'&;([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])&;'|sort|uniq
1
2
6
8
27
41
56
64
75
101
106
127
128
168
192
255

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读