grep简介
- grep(Global search regular expression and print out the line)全面搜索研究正则表达式并显示出来。grep 命令是一种强大的文本搜索工具,根据用户指定的模式”对目标文本进行匹配检查,打印匹配到的行,由正则表达式或者字符及基本文本字符所编写的过滤条件。Unix的grep家族包括grep、egrep和fgrep。
- grep的过滤是一种贪婪模式,只要有你搜的字符串则都会被过滤出来。
- grep 基本正则表达式
egrep = grep -E 扩展正则表达式
grep 正则表达式与扩展正则表达式
- 正规的 grep 不支持扩展的正则表达式子,竖线是用于表示“或”的扩展正则表达式元字符 , 正规的grep无法识别加上反斜杠,这个字符就被翻译成扩展正则表达式,就像 egrp和grep -E 一样。
举例:过滤出passwd文件里有root或bash的行:
grep "root|bash" passwd没有结果,所以需要扩展的grep
egrep "root|bash" passwd 过滤passwd文件里有root或bash的行
=grep -E "root|bash" passwd
查看帮助信息
- 命令:
grep --help
- 命令:
man grep
grep 的格式
grep | 匹配条件 | 处理文件 |
---|---|---|
grep | root | passwd |
grep | ^root | passwd |
grep | root$ | passwd |
grep -i | root | passwd |
grep -E | “root /bash” | passwd |
举例:
向passwd中加入chroot
grep root passwd ##贪婪模式 chroot也会过滤出来
grep ^root passwd ##以root开头的行
grep bash$ passwd ##以bash结尾的行
grep -E ^root passwd | grep bash$ ##passwd里以root开头,bash结尾的行,grep是单模式的,所以需要用扩展的grep即grep -E
grep -E "^root|bash$" passwd ##passwd里以root开头的或passwd结尾的
cat -b passwd | grep games -2 ##passwd里的有games的行以及这一行的上下两行
cat -b passwd | grep games -A2 ##A=After,后两行
cat -b passwd | grep games -B2 ##B=Before,前两行
测试
找出所有可以登陆系统的用户
注意/etc/passwd文件中以sh结尾的都可以登陆。
命令:grep -E "sh$" /etc/passwd | cut -d : -f 1
vim login.sh
#!bin/bash
grep -E "sh$" /etc/passwd | cut -d : -f 1
执行结果:
shell的种类:cat /etc/shells
grep 中的正则表达式
^westos
westos$
'w....s'
'w.....'
'.....s'
.就相当于占位符
x*y x出现0-任意次
新建一个文件:test
wetos
weetos
weeetos
ws
grep ws test
grep w...s test w,s中间三个字符的
grep w....s test w,s中间四个
grep w.....s test
grep -E w?????s test 任意多个?
举例:
grep 中字符的匹配次数设定
* | 字符出现 [0- 任意次 ] |
---|---|
\ ? | 字符出现 [0-1次 ] |
\ + | 字符出现 [1- 任意次 ] |
\ {n\ } | 字符出现 [n次 ] |
\ {m,n\ } | 字符出现 [ 最少出现 m次,最多出现 n次 ] |
\ {0,n\ } | 字符出现 [0-n次 ] |
\ {m,\ } | 字符出现 [ 至少 m次 ] |
\ (xy\ ){n\ }xy | 关键字出现 [n次 ] |
. * | 关键字之间匹配任意字符 |
cat test
xy
xxy
xxxxxxy
xxxxxxay
xyxyxyyxyy
y
grep xy test xy挨着的所有行
grep x*y test y前的x出现0-任意次
grep -E x?y test y前的x出现0-1次
grep -E 'x+y' test y和x一起出现1-任意次
grep -E 'x{2}y' test x出现两次,y前的
grep -E 'x{2,3}y' test y前的x出现2次或3次
grep -E 'x{2,}y' test y前的x出现2-无数次
grep -E 'x{,2}y' test y前的x出现0-2次
grep -E '(xy){2,}' test xy出现2-无数次
grep -E 'x.*y' test x和y之间匹配任意字符
grep -E 'x*y' test y前有任意多个x
举例:
grep 中字符的匹配位置设定
^ 关键字
关键字 $
< 关键字
关键字 >
< 关键字 >
举例:
grep "^root" passwd ##passwd里以root开头的行
grep "nologin$" passwd ##passwd里以nologin结尾的行
grep -E "\<root" passwd ##以root关键字开头的所有root单词,rootch也会被过滤
grep -E "root\>" passwd ##以root结尾的单词
grep -E "\<root\>" passwd ##只过滤root
测试题
抓取你的ip,输入网卡设备就会输出ip
命令:ifconfig eth0 | grep -E "\<inet\>" | cut -d " " -f 10
可以看到eth0的ip
脚本内容:
vim ip.sh
#!/bin/bash
[ -z "$1" ] && {
echo "Error:Please input a network interface!"
exit
}
ifconfig $1 | grep -E "\<inet\>" | cut -d " " -f 10
执行结果: