欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux三剑客之grep命令

程序员文章站 2022-05-13 11:06:24
...

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

###

###


fknakkfk

kfaktaktkakwt

# 打印出不以英文字开头的行
[aaa@qq.com slave ~]# grep '^[^a-zA-Z]' 123.txt 
123
456
789
000
^~`#$
%^%*^(&)_=
;'][[]/.,l'
###
###
# 过滤掉所有空行和以#开头的行
[aaa@qq.com slave ~]# grep -v '^#' 123.txt |grep -v  '^$' 
123
456
789
000
^~`#$
%^%*^(&)_=
;'][[]/.,l'
fknakkfk
kfaktaktkakwt
[aaa@qq.com slave ~]# 
# 搜索有sy的行,并输出行号
[aaa@qq.com slave ~]# grep -n 'sy' /etc/passwd
6:sync:x:5:0:sync:/sbin:/bin/sync
# 搜索没有sy的行,并输出行号
[aaa@qq.com 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
[aaa@qq.com slave ~]# 
# 显示/etc/passwd文件中不以/bin/bash结尾的行
[aaa@qq.com 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
[aaa@qq.com slave ~]# 
# 找出/etc/passwd文件中两位数或三位数
[aaa@qq.com 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
[aaa@qq.com slave ~]# 
# 找出/etc/grub.conf文件中,以至少一个空白字符开头,且后面非空白字符的行
[aaa@qq.com 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
[aaa@qq.com slave ~]# 
#  找出”netstat -tan”命令的结果中以’LISTEN’后跟0,1或多个空白字符结尾行
[aaa@qq.com 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      
[aaa@qq.com slave ~]# 
# 找出/proc/meminfo文件中,所有在大写或小写S开头的行,至少有两种实现方式
[aaa@qq.com 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
[aaa@qq.com 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
[aaa@qq.com slave ~]# 
# 找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行
grep "[[:alpha:]]\+(" /etc/rc.d/init.d/functions
egrep '[[:alpha:]]\+|\)|\(' /etc/rc.d/init.d/functions

Linux三剑客之grep命令

Linux三剑客之grep命令

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

Linux三剑客之grep命令

[aaa@qq.com 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
[aaa@qq.com slave ~]# 

Linux三剑客之grep命令

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

Linux三剑客之grep命令

相关标签: grep