grep命令
grep命令一般用来筛选需要的数据,文本过滤器(根据文本内容过滤文件)
格式:
grep [参数] [过滤的规则] [操作对象]
标准输出 | grep [参数] [过滤规则]
grep命令的参数
参数:
-n :显示过滤出来的文本在文件当中的行号
-o : 只显示匹配到的内容
-q : 静默输出(一般用来shell脚本当中)
-i : 忽略大小写
-c : 显示匹配到的行数
-v : 反向查找
-w : 匹配某个词
-E : 使用扩展正则
-R|-r :递归查询
-l : 匹配成功之后,将文本的名称只打印文件路径
拓展参数 :(了解)
-A : 显示匹配到的数据的后几n行
-B :显示匹配到的数据的前几n行
-C :显示匹配到的数据的前后各几n行
知识储备:
$? : 代表上一条命令执行是否成功
(0 :成功,非0代表失败)
词 : 一连串字母和数字组成的字符串 与-w搭配
wc : 匹配行数
-l : 打印匹配行数
-c : 打印匹配的字节数
案例1 :要过过滤出/etc/passwd 中包含的root的行及其行号
grep -n "root" /etc/passwd
案例2 : 要求过滤出/etc/passwd 中包含的root的行,只显示过滤到的内容
grep -o "root" /etc/passwd
案例3 :要求过滤/etc/passwd 中的Root,忽略大小写
grep -i 'Root' /etc/passwd
案例4 :要求匹配mail及其后两行
grep -n -A 2 "mail" /etc/passwd
案例5 :要求匹配mail及其前两行
grep -n -B 2 "mail" /etc/passwd
案例6 :要求匹配mail及其前后各两行
grep -n -C 2 "mail" /etc/passwd
案例7 :要求显示包含root有多少行
grep "root" /etc/passwd
grep -c "root" /etc/passwd # 2
案例8 :要求查询不包含root的行
grep -v "root" /etc/passwd
案例9 : 匹配词
grep -w '词' 1.txt
案例10 :要求匹配出包含 词 的行
grep -E "(词)+" 1.txt
案例11 :要求找出/etc目录下,那些文件中包含root
grep -R "root" /etc/
只打印文件路径
grep -Rl "root" /etc/
练习
1.计算/etc目录下包含root的文件有多少个?
grep -R -l "root" /etc/|wc -l
2.查询/etc/passwd文件中包含/bin/bash的行并输出行号
grep -n "/bin/bash" /etc/passwd
3.过滤出当前主机包含的ip
ip -a|grep -o -E "([0-9]{1,3}\.){3}([0-9]){1,3}"
正则表达式
正则表达式是通过包含特殊含义的一些字符去适配各种匹配一类字符串的公式场景。
普通正则表达式
* :匹配零个或多个前导字符
$ :以 前导字符结尾
. :匹配任意一个字符且只有一个字符(换行符除外)
^ : 以指定字符开头的行
[^] : 取反,排除括号中信息的。(不好含)
.* : 所有字符的任何个数(包含空行)
[] : 或者(其中包含所有的字符)
^$ : 过滤空行
\ : 转义字符(让其他原本有特殊含义的字符变的没有含义)还原字符的本来意思
[a-z] : a-z所有的一个字母
[A-Z] : A-Z所有的一个字母
[0-9] : 0-9所有的一个字母
^.*xxxx : 表示以开头到什么字符为止的内容(贪婪匹配)
^xxx.*xxxx$ : 表示以什么开头,并且以什么结尾的信息进行匹配出来
\.$ :表示查询出以点结尾的行
\n\r : 表示匹配一个换行符号
\t : 表示匹配一个制表符号
例1 :匹配包含22的行
grep "222?" 1.txt
1111122223333
22223333 .*
2222 2*
222 2?
例2 :以3结尾的行
grep -E "33$" 1.txt
例3 :要求输出包含eth的行
grep "eth." 2.txt
例4 :以1开头的行
grep "^1" 1.txt
例5 :要求打印出/etc/nginx/nginx.conf中的不是以#开头的行
grep "^[^#]" /etc/nginx/nginx.conf
例6 :要求匹配出2后面有任意数量的任意字符
grep "2." 1.txt
例7 :要求匹配出本机中所有的普通用户
grep ":[0-9][0-9][0-9][0-9]" /etc/passwd
扩展正则表达式(grep必须加-E参数,或者使用egrep命令)
egrep 等价于 grep -E
+ : 前导字符的一个或多个 与-E用
补充总结 :一般加号符号经常是与中括号使用,可以匹配出多个不同的连续字符
? :前导字符的零个或一个
| :或者 (竖线两边的字符)
() :分组,组成一个过滤指定整体
\n : n 代表的是前面第几个分组
{m,n} : 范围,至少有m个,最多有n个
{m} : 范围,固定m 个
{m,}: 范围,至少有m个
{} : 表示定义前面字符出现次数
{,n}: 匹配最多n次
正则符号注意事项 :
1. 按照每行信息进行过滤处理
2. 注意正则表达符号禁止中文
3. 附上颜色信息进行正则过滤
--color=auto/--color
例1 :匹配一个或多个2
egrep "2+" 1.txt
egrep "22*" 1.txt
egrep "2{1,}" 1.txt
例2 :查询出3个2
egrep "2{3}" 1.txt
例3 :查询出包含22或者33的行
egrep "22|33" 1.txt
例4 :匹配出包含12341234的行
grep "12341234" 1.txt
grep -E "(1234){2}" 1.txt
grep -E "(1234)\1" 1.txt
例5 :要求匹配出包含1234abcd1234abcd的行
grep "1234abcd1234abcd" 1.txt
grep -E "(1234)(abcd)\1\2" 1.txt
练习
将/etc/fstab文件中所有的注释行和空行过滤掉
[root@localhost tmp]# egrep -v "^$|^#" /etc/fstab
[root@localhost tmp]# egrep "^[^#]" /etc/fstab
[root@localhost ~]# grep -vE "^ *#|^$" /etc/fstab
练习
1. 过滤出当前系统IP
ip a |grep -o -E "([0-9]{1,3}\.){3}[0-9]{1,3}"
2. 过滤出手机号
echo "18712345678" |grep -E "(155|187|136|166|177|138)[0-9]{8}"
3. 过滤出邮箱
echo "123456@qq.com" |grep -E "[0-9a-zA-Z]+@[0-9a-z]+(\.com|\.com\.cn|\.edu|\.edu\.cn|\.top)"
4、将/etc目录下所有的普通文件打包压缩至/tmp目录
[root@localhost tmp]# tar -czPf /tmp/etc.tar.gz $(find /etc/ -type f | xargs )
5、将etc下包含root的文件打包压缩到/tmp目录下
[root@localhost tmp]# tar -czPf /tmp/grep.tar.gz $(grep -R -l "root" /etc/ | xargs )