Linux Linux grep命令用法以及正则表达

一、grep命令和正则表达式的简介

1、grep(Global search REgular expression and Print out the line),即全局搜索正则表达式并打印出匹配的行,它是Linux系统中一个强大的文本搜索工具,它根据用户指定的“模式(pattern)”对目标文本进行过滤,显示被模式匹配到的行;

2、正则表达式是由一类字符书写的模式,其中有些字符不表示符的字面意义,而是表示控制或通配的功能

二、grep命令的基本语法格式

grep [OPTION]... ‘PATTERN‘ FILE...
grep的常用选项:
  -v : 对匹配的行进行取反
  -o : 仅显示匹配到的内容
  -i : 忽略字符大小写
  -n : 为匹配的行加上行号
  -E : 使用扩展正则表达式 ,等同于egrep命令
  -F : 不使用正则表达式搜索,等同于fgrep命令
  -A # : 连同匹配行的下#行一并显示,#代表任意数字
  -B # : 连同匹配行的上#行一并显示,#代表任意数字
  -C # : 连同匹配行的上下#行一并显示,#代表任意数字
  --color=auto : 对匹配的内容以不同的颜色显示

三、grep正则表达式的基本用法

基本正则表达式:

1、字符匹配

.:匹配任意单个字符

例如:匹配以r开头,t结尾中间只隔了两个字符的行
[[email protected] ~]# grep ‘r..t‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[[email protected] ~]#

[]:匹配指定集合中的任意单个字符

常用的集合表示方法有:
  纯数字:[[:digit:]]或[0-9]
  小写字母:[[:lower:]]或[a-z]
  大写字母:[[:upper:]]或[A-Z]
  大小写字母:[[:alpha:]]或[a-zA-Z]
  数字加字母:[[:alnum:]]或[0-9a-zA-Z]
  空白字符:[[:space:]]
  标点符号:[[:punct:]]
例如:匹配包含数字0或2的行
[[email protected] ~]# grep ‘[02]‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
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:FTP User:/var/ftp:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
[[email protected] ~]#

[^]:匹配指定集合外的任意单个字符

例如:匹配包含除1-9范围之外的字符的行
[[email protected] ~]# grep ‘[^1-9]‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
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:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
rtkit:x:498:499:RealtimeKit:/proc:/sbin/nologin
pulse:x:497:498:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
[[email protected] ~]#

2、次数匹配

* : 匹配其前面的字符出现任意次,0、1或多次的行

创建一个测试文本,包含有以下内容:
[[email protected] ~]# cat grep_test.txt
y->1line
xy->2line
xxy->3line
xxxy->4line
aby->5line

abcy->7line
xyxy->8linexyxy
xxxy->9line
xy->10line
xxx->11linexy
[[email protected] ~]#
例如:匹配x字母出现任意次的行:
[[email protected] ~]# grep ‘x*y‘ grep_test.txt 
y->1line
xy->2line
xxy->3line
xxxy->4line
aby->5line
abcy->7line
xyxy->8linexyxy
xxxy->9line
xy->10line
xxx->11linexy
[[email protected] ~]#
注意:任意次,说明x可为0次。。

\+:匹配其前面的字符出现1次或多次的行

例如:匹配x字符至少1次的行
[[email protected] ~]# grep ‘x\+y‘ grep_test.txt 
xy->2line
xxy->3line
xxxy->4line
xyxy->8linexyxy
xxxy->9line
xy->10line
xxx->11linexy
[[email protected] ~]#

\?:匹配其前面的字符出现0次或1次的行

例如:匹配x字母出现0次或1次的行
[[email protected] ~]# grep ‘x\?y‘ grep_test.txt 
y->1line
xy->2line
xxy->3line
xxxy->4line
aby->5line
abcy->7line
xyxy->8linexyxy
xxxy->9line
xy->10line
xxx->11linexy
[[email protected] ~]#

\{m\}:匹配其前面的字符出现m次的行

例如:匹配x字母出现2次的行
[[email protected] ~]# grep ‘x\{2\}y‘ grep_test.txt 
xxy->3line
xxxy->4line
xxxy->9line
[[email protected] ~]#

\{m,n\}:匹配其前面的字符至少出现m次,至多出现n次的行,m和n表示一个范围[m-n]

例如:匹配x字母至少出现1次,至多出现3次的行
[[email protected] ~]# grep ‘x\{1,3\}y‘ grep_test.txt 
xy->2line
xxy->3line
xxxy->4line
xyxy->8linexyxy
xxxy->9line
xy->10line
xxx->11linexy
[[email protected] ~]#

3、位置锚定

^ : 行首锚定

例如:匹配x字母出现在行首的行
[[email protected] ~]# grep ‘^x‘ grep_test.txt 
xy->2line
xxy->3line
xxxy->4line
xyxy->8linexyxy
xxxy->9line
xy->10line
xxx->11linexy
[[email protected] ~]#

$ : 行尾锚定

例如:匹配e字母出现在行尾的行
[[email protected] ~]# grep ‘e$‘ grep_test.txt 
y->1line
xy->2line
xxy->3line
xxxy->4line
aby->5line
abcy->7line
xxxy->9line
xy->10line
[[email protected] ~]#

^$ : 匹配空白行

例如:匹配空白的行
[[email protected] ~]# grep ‘^$‘ grep_test.txt 

[[email protected] ~]#
这个文件只有一行空白行...

\< : 词首锚定

例如:精确匹配xy两个字母在一个单词的词首的行
[[email protected] ~]# grep ‘\<xy‘ grep_test.txt 
xy->2line
xyxy->8linexyxy
xy->10line
[[email protected] ~]#

\> : 词尾锚定

例如:精确匹配xy两个字母在一个单词的词尾的行
[[email protected] ~]# grep ‘xy\>‘ grep_test.txt 
xy->2line
xxy->3line
xxxy->4line
xyxy->8linexyxy
xxxy->9line
xy->10line
xxx->11linexy
[[email protected] ~]#

\<\> : 匹配单词

例如:匹配包含xy这个单词的行
[[email protected] ~]# grep ‘\<xy\>‘ grep_test.txt 
xy->2line
xy->10line
[[email protected] ~]#

4、分组

\(\) : 对某字符串进行分组匹配

例如:匹配xy单词出现0次或1次的行
[[email protected] ~]# grep ‘\(xy\)\?‘ grep_test.txt 
y->1line
xy->2line
xxy->3line
xxxy->4line
aby->5line

abcy->7line
xyxy->8linexyxy
xxxy->9line
xy->10line
xxx->11linexy
[[email protected] ~]#

后向引用:模式中,如果使用\(\)实现了分组,在某行文本的检查中,如果\(\)的模式匹配到了某内容,此内容后面的模式中可以被引用;

对前面的分组进行引用的符号为:\1 , \2 ,\3

模式自左而右,引用第#个左括号以及与其匹配右括号之间的模式匹配到的内容;

后向引用举例:

新建一个文本文件,假设有如下内容:

[[email protected] ~]# cat grep.txt 
He like his lover.
He love his love.
He like his liker.
He like his like.
[[email protected] ~]#
例如:找出前后相同单词的行:
[[email protected] ~]# grep ‘\(\<[[:alpha:]].*\>\).*\<\1\>‘ grep.txt 
He love his love.
He like his like.
[[email protected] ~]#

最后,正则表达式元字符总结:

字符匹配:. ,[] ,[^]

次数匹配:* ,\? ,\+ ,\{m\} ,\{m,n\}

位置锚定:^ ,$ ,\< ,\> ,\<\>

分组匹配:\(\)

四、egrep及扩展正则表达式:

egrep相当于grep -E,egrep可以直接使用扩展正则表达式,而grep需要加上选项-E;

扩展正则表达式的元字符:

字符匹配:. ,[] ,[^]

次数匹配:*,?,+,{m},{m,n},{m,},{0,n}

位置锚定:^,$,\>,\<

分组匹配:(),支持后向引用

| : 匹配左侧或右侧符合条件的行,比如a|b,含有a或b的行都匹配;

例如:egrep等同于grep -E
[[email protected] ~]# grep -E ‘k|i‘ grep.txt 
He like his lover.
He love his love.
He like his liker.
He like his like.
[[email protected] ~]# egrep ‘k|i‘ grep.txt 
He like his lover.
He love his love.
He like his liker.
He like his like.
[[email protected] ~]#

五、grep练习题:

(1).显示/proc/meminfo文件中以大写或小写s开头的行;

# grep -i ‘^s‘ /proc/meminfo

(2).显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;

# grep -v ‘/sbin/nologin$‘ /etc/passwd | cut -d: -f1

(3).显示/etc/passwd文件中其默认shell为/bin/bash的用户

进一步:仅显示上述结果中其ID号最大的用户

# grep ‘/bin/bash$‘ /etc/passwd | cut -d: -f1 | sort -n -r | head -1

(4).找出/etc/passwd文件中的一位数或两位数;

# grep ‘\<[[:digit:]]\{1,2\}\>‘ /etc/passwd

(5).显示/boot/grub/grub.conf中至少一个空白字符开头的行

# grep ‘^[[:space:]]\+.*‘ /boot/grub/grub.conf

(6).显示/etc/rc.d/rc.sysinit文件中,以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;

# grep ‘^#[[:space:]]\+[^[:space:]]\+‘ /etc/rc.d/rc.sysinit

(7).找出netstat -tan命令执行结果中包含‘LISTEN‘的行;

# netstat -tan | grep ‘LISTEN[[:space:]]*$

(8).添加用户bash,testbash,basher,nologin(SHELL为/sbin/nologin),而找出当前系统上其用户名和默认SHELL相同的用户;

# grep ‘\(\<[[:alnum:]]\+\>\).*\1$‘ /etc/passwd

(9).扩展题:新建一个文本文件,假设有如下内容:

He like his lover.

He love his lover.

He like his liker.

He love his liker.

找出其中最后一个单词是由此前某单词加r构成的行;

# grep ‘\(\<[[:alpha:]]\+\>\).*\1r‘ grep.txt

(10).显示当前系统上root、centos或user1用户的默认shell及用户名;

# grep -E ‘^(root|centos|user1\>)‘ /etc/passwd

(11).找出/etc/rc.d/init.d/functions文件中某单词后面跟一对小括号‘()"的行;

# grep -o ‘\<[[:alpha:]]\+\>()‘ /etc/rc.d/init.d/functions

(12).使用echo输出一个路径,而使用egrep取出其基名;

# echo /etc/rc.d/ | grep -o ‘[^/]\+/\?$‘ | grep -o ‘[^/]\+‘

时间: 2024-08-25 14:18:55

Linux Linux grep命令用法以及正则表达的相关文章

12个 Linux 中 grep 命令的超级用法实例

12个 Linux 中 grep 命令的超级用法实例 你是否遇到过需要在文件中查找一个特定的字符串或者样式,但是不知道从哪儿开始?那么,就请grep来帮你吧. grep是每个Linux发行版都预装的一个强有力的文件模式搜索工具.无论何种原因,如果你的系统没有预装它的话,你可以很容易的通过系统的包管理器来安装它(Debian/Ubuntu系中的apt-get和RHEl/CentOS/Fedora系中的yum). $ sudo apt-get install grep #Debian/Ubuntu

linux中grep命令-From cyber

1.作用 Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expr ession Print,表示全局正则表达式版本,它的使用权限是所有用户. 2.格式 grep [options] 3.主要参数 [options]主要参数: -c:只输出匹配行的计数. -I:不区分大 小写(只适用于单字符). -h:查询多文件时不显示文件名. -l:查询多文件时只输出包含匹配字符的文件名. -n:显示匹配行及

由一条Linux的grep命令说起

今天在开发的时候,看到同事使用了这样的一条linux命令 grep 'class YourClass' -rwi * |grep -v svn 想到了 grep命令的,几个参数. -r 明确要求搜索子目录(忽略子目录为 -d skip) -i 不区分大小写地搜索.默认情况区分大小写 -w 只匹配整个单词,而不是字符串的一部分(如匹配’magic’,而不是’magical’), -v 显示不包含匹配文本的所有行 以此 mark 更详细的说明如下: 1.作用 Linux系统中grep命令是一种强大的

linux的grep命令

grep是一种强大的文本搜索工具,它能够使用正则表达式搜索文本,并将搜索到的内容打印出来. grep命令的格式:grep [options] PATTERN [FILE..] 搜索成功将执行状态为0,未搜索到将返回1,搜索文件的路径错误将返回2. [options]: -c:显示匹配到了多少行 -n:为输出的文件添加行号 -v:显示没匹配到的行 -o:只显示被匹配到的字符串 -i:忽略大小写 --color: 给匹配到的字符添加颜色 [PATTERN]: PATERN可以使普通的字符串,也可以使

&lt;Linux系统uname命令用法&gt;

uname命令:操作系统信息的显示 uname 命令主要用于显示操作系统的信息,包括版本.平台的信息. 它的参数主要有以下: -a 显示全部信息 -s 显示内核名称 -n 显示主机名 -r 显示当前系统的内核版本 -m 显示主机的硬件名称 -p 显示处理器的类型 -i 显示主机的硬件平台 -o 显示所使用的操作系统的名称 下面来看一看: [[email protected] ~]# uname -a Linux redhat.example.com 2.6.32-279.el6.i686 #1

&lt;Linux系统minfo命令用法&gt;

minfo命令——ms-dos文件系统的各项参数的显示 minfo这个指令主要用于显示MS-DOS文件系统的各项参数,包括扇区数.磁头数.柱面数等. 参数主要有以下几个: -v 显示详细的参数 drive 指定驱动 显示系统C盘的参数信息并显示启动扇区内容. [[email protected] ~]# minfo -v C:Drive 'C:' not supported //警告不支持,其实用法是对的. <Linux系统minfo命令用法>

Linux中rename命令用法学习 修改文件名

如何用命令修改文件名呢?在linux下可以用rename命令,当然还可以使用mv命令,这里分享下linux rename命令的用法. 有一部分人说linux下没有rename命令,建议大家用mv命令.对rename命令和mv命令在重命名文件方面做一个比较,大家根据个人喜欢选择使用吧. mv命令,在man mv中对于mv命令的介绍:mv -move(rename) files 可以看到mv命令确实有重命名的功能,但是实际应用中,它只能对单个文件重命名,命令如下:mv [path/]oldfilen

linux中grep命令的用法(转)

作为linux中最为常用的三大文本(awk,sed,grep)处理工具之一,掌握好其用法是很有必要的. 首先谈一下grep命令的常用格式为:grep  [选项]  ”模式“  [文件] grep家族总共有三个:grep,egrep,fgrep. 常用选项: -E :开启扩展(Extend)的正则表达式. -i :忽略大小写(ignore case). -v :反过来(invert),只打印没有匹配的,而匹配的反而不打印. -n :显示行号 -w :被匹配的文本只能是单词,而不能是单词中的某一部分

linux中grep命令的用法

作为linux中最为常用的三大文本(awk,sed,grep)处理工具之一,掌握好其用法是很有必要的.首先谈一下grep命令的常用格式为:grep  [选项]  "模式"  [文件] grep家族总共有三个:grep,egrep,fgrep. 常用选项: -E :开启扩展(Extend)的正则表达式. -i :忽略大小写(ignore case). -v :反过来(invert),只打印没有匹配的,而匹配的反而不打印. -n :显示行号 -w :被匹配的文本只能是单词,而不能是单词中的