Linux三剑客之grep命令

1、grep简介

grep (缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行。Unix的grep家族包括grep、egrep和fgrep。Windows系统下类似命令FINDSTR。

grep用来基于正则去实现行过滤的工具;它有很多衍生命令:

egrep 扩展的grep,即默认使用扩展正则表达式的grep,更高级。

fgrep 专用于文件行过滤的工具。

2、grep的工作原理

grep命令在一个或多个文件中查找某个字符模式,如果这个模式中包含空格,就必须用引号把它括起来。grep命令中,模式可以是一个被引号括起来的字符串,也可以是单个词。位于模式之后的所有单词都被视为文件名。grep将输出发送到屏幕,它不会对输入文件进行任何修改或变化。grep返回的退出状态为0,表示成功。退出状态为1,表示没有找到。如果找不到指定的文件,退出状态为2。

3、grep命令的常用选项

--color=auto 对匹配到的文本着色显示。

-v           显示不被pattern匹配到的行,反向查找。

-V           或--version : 显示版本信息。

-i           忽略字符大小写。

-n           显示匹配的行号,在显示符合样式的那一行之前,标示出该行的列数编号。

-o           仅显示匹配到的字符串,只显示匹配PATTERN 部分。

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

-a           或 --text : 不要忽略二进制的数据。

-A           # after, 后#行, 除了显示符合范本样式的那一列之外,并显示该行之后的内容。

-b           或 --byte-offset : 在显示符合样式的那一行之前,标示出该行第一个字符的编号,将可执行文件当文本文件来搜索。

-B           # before, 前#行,除了显示符合样式的那一行之外,并显示该行之前的内容。

-c           统计匹配的行数,计算符合样式的列数。

-C           # context, 前后各#行,除了显示符合样式的那一行之外,并显示该行之前后的内容。

-d           <动作>--directories=<动作> : 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。

-e           实现多个选项间的逻辑or关系,指定字符串做为查找文件内容的样式。

-E           使用ERE,相当于egrep。

-w           匹配整个单词,只显示全字符合的列。

-f           <规则文件>--file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。

-F           相当于fgrep,不支持正则表达式, 将样式视为固定字符串的列表。

-h           查询多文件时不显示文件名。

-H           或 --with-filename : 在显示符合样式的那一行之前,表示该行所属的文件名称。

-l           查询多文件时只输出包含匹配字符的文件名, 列出文件内容符合指定的样式的文件名称。

-L           或 --files-without-match : 列出文件内容不符合指定的样式的文件名称。

-s           不显示不存在或无匹配文本的错误信息。

-r           或 --recursive : 此参数的效果和指定"-d recurse"参数相同,递归搜索文件目录。

-x           --line-regexp : 只显示全列符合的列。

-y           此参数的效果和指定"-i"参数相同。

-G           或 --basic-regexp : 将样式视为普通的表示法来使用。

4、主要参数

\          忽略正则表达式中特殊字符的原有含义,转义符

^          匹配正则表达式的开始行

$          匹配正则表达式的结束行

^$         表示空行的意思

\<         从匹配正则表达式的行开始

\>         到匹配正则表达式的行结束

[]         单个字符,如[A]即A符合要求,匹配中括号内的字符,匹配指定范围内的任意单个字符

[^]        ^出现在[]内 代表排除“非” 举例:[^0-9] 排除纯数字  [^a-z] 排除纯字母 

[ - ]      范围,如[a-z]

?          匹配之前的项1次或0.          所有的单个字符

+          匹配之前的项1次或多次

*          表示有多个字符,长度也可以为0

()         匹配表达式,创建一个用于匹配的子串

.*         代表任意多个字符

\?         匹配01次字符

\+         匹配1或以上字符
环境准备
准备一台Centos6服务器
系统: Centos6.8
内存:1G
cpu: 2核
IP地址: 10.0.0.22

5、举例练习

# 匹配ab之间13个任意字符  .和{} 组合限定指定范围的任意字符串
[root@ slave ~]# grep 'a.\{1,3\}b' /etc/passwd
dbus:x:81:81:System message bus:/:/sbin/nologin
[root@ slave ~]# 
# 过滤出邮件信息
[root@ slave ~]# grep '\<mail\>' /etc/passwd 
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[root@ slave ~]# 
# 输出超级用户信息
[root@ slave ~]# egrep '(ro+t).*\1' /etc/passwd 
root:x:0:0:root:/root:/bin/bash
[root@ slave ~]# 
# 编辑文件,添加完后wq保存退出。
vim 123.txt 
# 添加如下
123
456
789
000
^~`#$
%^%*^(&)_=
;'][[]/.,l'

###

###


fknakkfk

kfaktaktkakwt

# 打印出不以英文字开头的行
[root@ slave ~]# grep '^[^a-zA-Z]' 123.txt 
123
456
789
000
^~`#$
%^%*^(&)_=
;'][[]/.,l'
###
###
# 过滤掉所有空行和以#开头的行
[root@ slave ~]# grep -v '^#' 123.txt |grep -v  '^$' 
123
456
789
000
^~`#$
%^%*^(&)_=
;'][[]/.,l'
fknakkfk
kfaktaktkakwt
[root@ slave ~]# 
# 搜索有sy的行,并输出行号
[root@ slave ~]# grep -n 'sy' /etc/passwd
6:sync:x:5:0:sync:/sbin:/bin/sync
# 搜索没有sy的行,并输出行号
[root@ slave ~]# grep -nv 'sy' /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:halt:x:7:0:halt:/sbin:/sbin/halt
9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
11:operator:x:11:0:operator:/root:/sbin/nologin
12:games:x:12:100:games:/usr/games:/sbin/nologin
13:gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
14:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
15:nobody:x:99:99:Nobody:/:/sbin/nologin
16:dbus:x:81:81:System message bus:/:/sbin/nologin
17:vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
18:abrt:x:173:173::/etc/abrt:/sbin/nologin
19:haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
20:ntp:x:38:38::/etc/ntp:/sbin/nologin
21:saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
22:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
23:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
24:tcpdump:x:72:72::/:/sbin/nologin
25:mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
26:apache:x:48:48:Apache:/var/www:/sbin/nologin
[root@ slave ~]# 
# 显示/etc/passwd文件中不以/bin/bash结尾的行
[root@ slave ~]# 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
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
dbus:x:81:81:System message bus:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/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
tcpdump:x:72:72::/:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
[root@ slave ~]# 
# 找出/etc/passwd文件中两位数或三位数
[root@ slave ~]# grep '[1-9]\{1,2\}[1-9]'  /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
dbus:x:81:81:System message bus:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/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
tcpdump:x:72:72::/:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
apache:x:48:48:Apache:/var/www:/sbin/nologin
[root@ slave ~]# 
# 找出/etc/grub.conf文件中,以至少一个空白字符开头,且后面非空白字符的行
[root@ slave ~]# grep '^[[:space:]]\+[[:alpha:]]' /etc/grub.conf 
	root (hd0,0)
	kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=UUID=3c2d1d69-6f5c-463c-9c74-96a59f4ac2ff rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
	initrd /initramfs-2.6.32-642.el6.x86_64.img
[root@ slave ~]# 
#  找出”netstat -tan”命令的结果中以’LISTEN’后跟0,1或多个空白字符结尾行
[root@ slave ~]# netstat -tan | grep 'LISTEN[[:space:]].*$'
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      
tcp        0      0 :::80                       :::*                        LISTEN      
tcp        0      0 :::22                       :::*                        LISTEN      
[root@ slave ~]# 
# 找出/proc/meminfo文件中,所有在大写或小写S开头的行,至少有两种实现方式
[root@ slave ~]# egrep "^(S|s)" /proc/meminfo 
SwapCached:            0 kB
SwapTotal:        786428 kB
SwapFree:         786428 kB
Shmem:               324 kB
Slab:              87544 kB
SReclaimable:      62424 kB
SUnreclaim:        25120 kB
[root@ slave ~]# egrep ^[Ss] /proc/meminfo
SwapCached:            0 kB
SwapTotal:        786428 kB
SwapFree:         786428 kB
Shmem:               324 kB
Slab:              87536 kB
SReclaimable:      62420 kB
SUnreclaim:        25116 kB
[root@ slave ~]# 
# 找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行
grep "[[:alpha:]]\+(" /etc/rc.d/init.d/functions
egrep '[[:alpha:]]\+|\)|\(' /etc/rc.d/init.d/functions

在这里插入图片描述

在这里插入图片描述

# 找出ifconfig命令结果中的1-255之间的数值
ifconfig eth0 | egrep -o "[1-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]"

在这里插入图片描述

[root@ slave ~]# egrep "(^[[: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
[root@ slave ~]# 

在这里插入图片描述

# 输出ifconfig命令结果中的IP地址
[root@ slave ~]# ifconfig eth0 | grep "inet " | sed 's/[[:space:]]\+inet //' | sed "s/  .*//"
addr:10.0.0.22
[root@ slave ~]# 

在这里插入图片描述

发布了68 篇原创文章 · 获赞 24 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/aaronszm/article/details/103872930