Linux三剑客之grep使用入门指南

Linux的grep是一个具有强大功能的文本搜索工具,正确的学习和使用,能很大程度上提高工作效率,减轻运维工作所面临的压力。

Linux三剑客:grepsedawk


一、grep

grep:

(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具。

Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能

作用:

文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查,它能使用正则表达式搜索文本,并把匹配的行打印出来。

模式:

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

语法:

grep [OPTIONS] PATTERN [FILE…]

model:

root@Eric(Eric) ~]#grep  Eric /etc/passwd

Eric:x:1001:1001::/home/Eric:/bin/bash

grep的基本正则表达式命令选项:

–color=auto: 对匹配到的文本着色显示

model:

[root@centos6(Eric)~]#grep –color=auto root /etc/passwd

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

注:因为编辑器的原因,所以颜色没有高亮显示

-v: 显示不被pattern匹配到的行

[root@centos6(Eric) Eric]#grep -v root passwd

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

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

dbus:x:81:81:System message bus:/:/sbin/nologin

usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin

rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin

rtkit:x:499:499:RealtimeKit:/proc:/sbin/nologin

avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin

vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin

abrt:x:173:173::/etc/abrt:/sbin/nologin

rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin

nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

haldaemon:x:68:68:HAL daemon:/:/sbin/nologin

ntp:x:38:38::/etc/ntp:/sbin/nologin

apache:x:48:48:Apache:/var/www:/sbin/nologin

saslauth:x:498:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin

postfix:x:89:89::/var/spool/postfix:/sbin/nologin

gdm:x:42:42::/var/lib/gdm:/sbin/nologin

pulse:x:497:496:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin

sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

tcpdump:x:72:72::/:/sbin/nologin

Eric:x:500:500::/home/Eric:/bin/bash

注:为了显示匹配的效果,所以,匹配这个文本有点长,如果自己测试,可以新建或者拷贝一个文件,删除一些内容。

 

-i: 忽略字符大小写

[root@centos6(Eric) Eric]#grep eric -i passwd

Eric:x:500:500::/home/Eric:/bin/bash

 

-n:显示匹配的行号

[root@centos6(Eric) Eric]#grep Eric -n passwd

34:Eric:x:500:500::/home/Eric:/bin/bash

 

注:前面的34就是显示的行号。

-c: 统计匹配的行数

[root@centos6(Eric) Eric]#grep root -c passwd

2

下面结果证明显示的匹配到行数是正确

[root@centos6(Eric) Eric]#grep root  passwd

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

 

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

[root@centos6(Eric) Eric]#grep root  -o passwd

root

root

root

root

 

-q:静默模式,不输出任何信息

[root@centos6(Eric) Eric]#grep root  -q passwd

 

-A #:after,后#行

[root@centos6(Eric) Eric]#grep root  -A 3 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

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

 

-B #:before,前#行

[root@centos6(Eric) Eric]#grep Eric  -B 3 passwd

pulse:x:497:496:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin

sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

tcpdump:x:72:72::/:/sbin/nologin

Eric:x:500:500::/home/Eric:/bin/bash

 

-C #:context,前后各#行

[root@centos6(Eric) Eric]#grep ftp  -C 3 passwd

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

dbus:x:81:81:System message bus:/:/sbin/nologin

usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin

 

-e:实现多个选项间的逻辑or关系

grep -e ‘Eric’ -e ‘root’ file

 

[root@centos6(Eric) Eric]#grep -e Eric -e root passwd

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

Eric:x:500:500::/home/Eric:/bin/bash

 

-w:匹配整个单词

 

[root@centos6(Eric) Eric]#grep /var/ftp -w passwd

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

 

-E:使用ERE

-F:相当于fgrep,不支持正则表达式

 

基本正则表达式

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

程序支持:grep,sed,awk,vim,less,nginx,varnish等

 

分两类:

基本正则表达式:BRE

扩展正则表达式:ERE

grep – E,egrep

正则表达式引擎:

采用不同算法,检查处理正则表达式的软件模块PCRE(Perl Compatible Regular Expressions)

 

元字符分类:

字符匹配、匹配次数、位置锚定、分组

man 7 regex

 

字符匹配:

.: 匹配任意单个字符

 

[root@centos6(Eric) ~]#ls in*

install.log  install.log.syslog

 

[]:匹配指定范围内的任意单个字符

 

[root@centos6(Eric) ~]#ls in[a-z]tall.log

install.log

 

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

 

[root@centos6(Eric) ~]#touch 968a.log

[root@centos6(Eric) ~]#ls 968[^0-9].log

968a.log

 

[:alnum:]:字母和数字

 

[root@centos6(Eric) ~]#ls [[:alnum:]]*.log

968a.log  968.log  install.log

 

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

 

[root@centos6(Eric) ~]#ls [[:alpha:]]*.log

install.log

 

[:lower:]:小写字母

 

[root@centos6(Eric) ~]#touch Eric.log

[root@centos6(Eric) ~]#ls [[:lower:]]*.log

install.log

 

[:upper:]:大写字母

 

[root@centos6(Eric) ~]#ls [[:upper:]]*.log

Eric.log

 

[:blank:]:空白字符

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

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

[:digit:]:十进制数字

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

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

[:print:]:可打印字符

[:punct:]:标点符号

 

正则表达式

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

 

*:匹配前面的字符任意次,包括0次

贪婪模式:尽可能长的匹配

.*:任意长度的任意字符

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

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

\{n\}:匹配前面的字符b次

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

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

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

 

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

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

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

^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

 

model:

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

[root@centos6(Eric) Eric]#grep -i “^s” /proc/meminfo

SwapCached:            0 kB

SwapTotal:       2097148 kB

SwapFree:        2097148 kB

Shmem:               248 kB

Slab:              35684 kB

SReclaimable:       9104 kB

SUnreclaim:        26580 kB

 

以下方法都可:

grep “^[Ss]” /proc/meminfo

grep “^S\|^s” /proc/meminfo

grep -e ^s -e ^S  /proc/meminfo

 

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

 

[root@centos6(Eric) Eric]#grep -v “/bin/bash$” /etc/passwd

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

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

[root@centos6(Eric) Eric]#grep “rpc\b” /etc/passwd  |cut -d: -f7

/        sbin/nologin

 

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

 

[root@centos6(Eric) Eric]#grep –color “[[: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: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

Eric:x:500:500::/home/Eric:/bin/bash

rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin

mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash

ntp:x:38:38::/etc/ntp:/sbin/nologin

 

5、显示CentOS7的/etc/grub2.cfg文件中,至少以一个空白

字符开头的且后面存非空白字符的行

 

[root@Eric(Eric) ~]#grep “^[[:space:]]\+[^[:space:]]” /etc/grub2.cfg

 

注:后面显示内容较多,此处省略。

 

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

 

[root@Eric(Eric) ~]#netstat -tan | grep “^LISTEN[[:space:]]\+”

 

7、显示CentOS7上所有系统用户的用户名和UID_

 

[root@Eric(Eric) ~]#cat /etc/passwd | cut -d: -f1,3 | grep “\b[0-9]\?[0-9]\?[0-9]\b”

root:0

bin:1

daemon:2

adm:3

lp:4

sync:5

shutdown:6

halt:7

mail:8

operator:11

games:12

ftp:14

nobody:99

 

8、添加用户bash、testbash、basher、sh、nologin(其shell 为/sbin/nologin),找出/etc/passwd用户名同shell名的行_

 

cat /etc/passwd |grep “\(^.*\)\>.*\<\1$”

cat /etc/passwd |egrep “(^.*)\>.*/\1$”

 

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

[root@centos6(Eric) Eric]#df | grep -o “[[:digit:]]\+%” |sort -nr

31%

18%

7%

0%

 

egrep及扩展的正则表达式

egrep = grep -E

 

语法:

egrep [OPTIONS] PATTERN [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

 

model:

1、显示三个用户root、mage、wang的UID和默认shell

[root@centos6(Eric) Eric]#cat /etc/passwd | grep -E “^(root|mage|wang)\b” |cut -d: -f3,7

0:/bin/bash

 

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

[root@centos6(Eric) Eric]#grep -E “^[[:alpha:]_]+\(\)” /etc/rc.d/init.d/functions

 

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

[root@centos6(Eric) Eric]#echo /etc/rc.d/init.d/functions | grep -Eo “[^/]+/?$”

functions

 

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

[root@centos6(Eric) Eric]#echo /etc/rc.d/init.d/functions | grep -Eo “^/.*/”

/etc/rc.d/init.d/

 

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

[root@centos6(Eric) Eric]#last | egrep -o “^root\>.*[0-9]\.[0-9]{1,3}” |tr -s ” ” “#” | cut -d# -f3 |sort -n |uniq -c

1 172.16.15.100

26 172.16.99.1

 

[root@centos6(Eric) Eric]#last | grep ^root | egrep -o “([0-9]{1,3}\.){3}[0-9]{1,3}” | sort | uniq -c

1 172.16.15.100

26 172.16.99.1

 

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

echo {1..100} |egrep -o “\b[0-9]\b”

echo {1..100} |egrep -o “\b[0-9]{2}\b”

echo {1..1000} |egrep -o “\b1[0-9][0-9]\b”

echo {1..1000} |egrep -o “\b2[0-4][0-9]+\b”

echo {1..1000} |egrep -o “\b25[0-5]+\b”

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

ifconfig | egrep -o “([0-9]{1,3}\.){3}[0-9]{1,3}”

 

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

cho “welcome to magedu linux” |grep -Eo [a-z] | sort | uniq -c|sort -nr

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/86664

(0)
泰谷子泰谷子
上一篇 2017-09-09
下一篇 2017-09-09

相关推荐

  • centos系统自动化安装

    本章内容 系统安装过程配置anaconda自动化安装系统 安装程序 CentOS系统安装 系统启动流程: bootloader–>kernel(initramfs)–>rootfs–>/sbin/init anaconda: 系统安装程序 tui: 基于图形库curses的文本窗口 gui:图形窗口 安装程序启动过程 MBR…

    Linux干货 2016-09-19
  • 系统自动化安装的实现及SELINUX的设置

    系统的自动化安装     anaconda:系统安装程序         tui:基于图形库curses的文本窗口         gui:图形窗口     装载根文件系统,并启动…

    Linux干货 2016-09-16
  • 马哥教育网络班21期第七周作业

    1、创建一个10G分区,并格式为ext4文件系统;   (1) 要求其block大小为2048, 预留空间百分比为2, 卷标为MYDATA, 默认挂载属性包含acl;   (2) 挂载至/data/mydata目录,要求挂载时禁止程序自动运行,且不更新文件的访问时间戳; [root@localhost ~]#…

    Linux干货 2016-10-09
  • Linux用户和组管理

    使用对象:Linux初学者   Linux系统中用户和组管理是很重要的一部分内容。许多初学者在学习或刚接触到用户管理的时候会觉得很难理解,命令多、选项多、配置文件也多,用命令可以修改,用配置文件也可以修改,三两下就被绕进去了。其实完全没必要晕,只要了解了用户管理的方式,就会很容易理解命令选项与配置文件之间的关系。下面我们就来了解下用户管理命令与配置…

    Linux干货 2016-10-23
  • 逻辑卷的命令解析

    前言    lvm是logical volume manager(逻辑卷管理器)的简称,通过将若干个磁盘分区连接成一个整块的卷组(volumegroup),形成一个存储池,管理员可以在卷组上随意创建逻辑卷(logicalvolumes),并进一步在逻辑卷组上创建文件系 统。管理员通过LVM可以方便的调整存储卷组的大小,并且可以对磁盘存储按…

    Linux干货 2016-08-30
  • lvs-dr

            通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变;     VIP通常配置在lo:0…

    2017-06-29