grep是一种强大的文本搜索工具,它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行。Unix的grep家族包括grep、egrep和fgrep
#grep "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nolog
常用参数
-A num 显示匹配行之后num行的内容
-B num 显示匹配行之前num行的内容
-C num 显示匹配行前后num行的内容
-b 标识出匹配行的第一个字符的编号
-n 标识出匹配行的列数编号
-c 统计符合匹配要求的行数
-v 反向过滤显示
-i 忽略大小写
-E 扩展正则匹配
-w 全词匹配
-r 遍历指定目录下面的所有文件
-l 列出满足要求的文件名称
-L 列出不满足要求的文件名称
-o 仅显示匹配到的字符串
#grep -A 3 "root" /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
--
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
#grep -B 1 "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
--
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
#grep -C 2 "root" /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
--
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
#grep -b "root" /etc/passwd
0:root:x:0:0:root:/root:/bin/bash
340:operator:x:11:0:operator:/root:/sbin/nologin
#grep -n "root" /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
#grep -c "root" /etc/passwd
2
#grep -v "root" /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
#grep -i "yup" /etc/passwd
yup:x:1000:1000::/home/yup:/bin/bash
YUP:x:1001:1001::/home/YUP:/bin/bash
#grep "yup|root" /etc/passwd
#grep -E "yup|root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
yup:x:1000:1000::/home/yup:/bin/bash
#grep "yup" /etc/passwd
yup:x:1000:1000::/home/yup:/bin/bash
yupp:x:1002:1002::/home/yupp:/bin/bash
#grep -w "yup" /etc/passwd
yup:x:1000:1000::/home/yup:/bin/bash
#grep -r "bash" ./
./simulation_login.sh:#!/bin/bash
./big_num.sh:#!/bin/bash
#grep -r -l "bash" ./
./simulation_login.sh
./big_num.sh
#grep -r -L "bash" ./
./111/11
#grep -o "root" /etc/passwd
root
root
root
root
基础正则匹配
^ 以···开头 ^str 以str开头
$ 以···结尾 str$ 以str结尾
. 匹配一个非换行符 ro.t 匹配ro + 任意一个字符 + t 的字符 例:root roet toxt
* 匹配0个或多个先前字符 ro*t 匹配r + 任意个o + t 的字符 例:rot root rt
.* 一起用代表任意字符 r.*t 匹配r + 任意字符 + t 的字符 例:rot roxt root rsadat
[]/[m1-m2] 匹配指定范围内的字符 r[a-z]t 匹配r + a-z任意一个字符 + t 的字符 例: rat rzt
[^] 匹配一个不在指定范围内的字符 r[^1-9]t 匹配r + 除1-9之外的任意一个字符 + t 的字符 例: rat rzt
\< 匹配字符的开始 \<root 匹配以root开头的单词的行
\> 匹配字符的开始 login\> 匹配以login结尾的单词的行
\b 单词锁定符 \broo\b 只匹配roo。
#grep "^root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
#grep "nologin$" /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
#grep "ro.t" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
#grep "ro*t" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
#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
systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin
systemd-resolve:x:193:193:systemd Resolver:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
#grep "r[a-z]t" /etc/passwd
operator:x:11:0:operator:/root:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
#grep "r[^1-9]t" /etc/passwd
operator:x:11:0:operator:/root:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
pesign:x:995:992:Group for the pesign signing daemon:/var/run/pesign:/sbin/nologin
#grep "\<root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
#grep 'login\>' /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
#grep '\broo\b' /etc/passwd
#grep 'roo' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
拓展正则表达式
x\{m\} 重复字符x出现m次 o\{2\} 匹配包含2个o的行
x\{m,\} 重复字符x出现至少m次 o\{2,\} 匹配至少有2个o的行。
x\{m,n\} 重复字符x,出现至少m-n次,如:o\{2,5\}匹配2-5个o的行
? 匹配0个或1个在其之前的那个普通字符 ro?t 例: rt rot
+ 匹配1个或多个在其之前的那个普通字符,重复前面字符1到多次 例:ro+t -》 root rot
() 表示一个字符集合或用在expr中,匹配整个括号内的字符串 例:r(a|o)ot -》 raotroot
| 表示“或”,匹配一组可选的字符,或(or)的方式匹配多个字串 例:r(a|o)ot -》 raotroot
#grep -E o\{2\}t /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
#grep -E o\{1,\} /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
#grep -E o\{2,5\} /etc/passwd
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
#grep -E "ro?t" /etc/passwd
abrt:x:173:173::/etc/abrt:/sbin/nologin
#grep -E "ro+t" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
#grep -E "ro(o|a)t" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
特殊字符
[[:alnum:]] #文字数字字符
[[:alpha:]] #文字字符
[[:digit:]] #数字字符
[[:graph:]] #非空字符(非空格、控制字符)
[[:lower:]] #小写字符
[[:cntrl:]] #控制字符
[[:print:]] #非空字符(包括空格)
[[:punct:]] #标点符号
[[:space:]] #所有空白字符(新行,空格,制表符)
[[:upper:]] #大写字符
[[:xdigit:]] #十六进制数字(0-9,a-f,A-F)
示例
1.求出所有人的年龄总和
#cat test.txt
xiaoming=20
xiaohong=18
xiaoqiang=22
#grep -Eo "[0-9]+" test.txt | tr '\n' + | grep -Eo '.*[0-9]' |bc
60
2.找出netstat -tan命令执行结果中包含’LISTEN’的行
#netstat -tan |grep "LISTEN[[:space:]]*$"
tcp 0 0 0.0.0.0:5355 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp6 0 0 :::5355 :::* LISTEN
tcp6 0 0 :::22 :::* LISTEN
3.使用echo输出一个路径,而使用grep取出其基名
#echo /etc/rc.d/init.d/ |grep -Eo "[^/]+/?$" |grep -Eo '[^/]+'
init.d