文章目录
一、grep工具介绍
Linux系统grep命令只要是用于查找文件里符合条件的字符串,通过各个选项的配合,能进行花样查找匹配去满足我们的需求。
Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。
在linux系统的命令行输入grep --help可以查看grep的帮助文档,grep命令有很多选项,在平常使用的使用不需要全部记住,掌握常用选项就足够使用了
二、grep命令常用选项
选项 | 用法 |
---|---|
-a | 将 binary 文件以 text 文件的方式搜寻数据 |
-c | 统计找到 ‘搜寻字符串’ 的次数 |
-d | 当指定要查找的是目录而非文件时,使用-d参数,-d参数后面的有效参数有三个:分别是read(读取),recurse(递归),skip(跳过),使用-d参数的时候,需要根据实际情况加上前面三个参数之一 |
-f | 指定样本文件,假设要在某个文件中查找"root",“ops”,则可以添加"root"与"ops"到一个文件里面,每一行一个样本,这个文件就是样本文件,命令格式:grep -f 样本文件 目标文件 |
-i | 忽略大小写的不同,所有大小写视为相同的字母 |
-n | 输出所匹配的字符串所在的行的行号 |
-o | 只输出被匹配模式匹配到的部分,如果匹配模式匹配的不是一整行,则不会输出一整行 |
-q | 静默输出,不输出显示任何信息 |
-r | 此参数的效果和指定“-d recurse”参数相同 |
-v | 取反(反向查找),亦即显示出没有 ‘搜寻字符串’ 内容的那一行 |
-w | 精确匹配,被匹配的文本只能是单词,而不能是单词中的某一部分,如查找文本中有interester与interest分别在不同的行,而我只想找出含有interest的行,这时候就可以使用-w选项来指定搜索的行的是含有interest的行,这样就可以避免匹配到interester的行 |
\b | 边界符,单词锁定符,如: \bxxxx\b只匹配xxxx,与-w选项类似 |
-A | 输出搜寻字符串所在的行及其后面n行(grep -A n “字符串” filename),after |
-B | 输出搜寻字符串所在的行及其前面N行(grep -B n “字符串” filename), before |
-C | 输出搜寻字符串所在的行及其前后的各n行((grep -C n “字符串” filename)),context |
-E | PATTERN(模式)是扩展的正则表达式(ERE),开启支持扩展正则表达式,grep -E相当于egrep命令 |
-F | PATTERN(模式)是一组用换行符分隔的固定字符串,使用该参数可以把一个样本文件的内容视为固定字符串的列表 |
-G | PATTERN(模式)是一个基本的正则表达式(BRE) |
--color=auto |
可以将找到的关键词部分加上颜色的显示 |
三、实例
1.将/etc/passwd文件中含有 root 的行取出来
#grep "root" /etc/passwd
或
#cat /etc/passwd | grep "root"
2.-c选项的使用,统计/etc/passwd文件中含有root的行的行数
#grep "root" /etc/passwd | wc -l
或
#cat /etc/passwd | grep "root" wc -l
3.-d与-r选项的使用,找出/tmp目录下文件内容包含ops的文件
tmp.txt的文件内容:
cat tmp.txt
ops
ops_11111
#查找
#grep -d recurse "ops" /tmp 或 grep -r "ops" /tmp
#输出内容如下:
/tmp/tmp.txt:ops
/tmp/tmp.txt:ops_11111
#提取文件名
#grep -d recurse "ops" /tmp | awk -F: '{print $1}' 或 grep -r "ops" /tmp | awk -F: '{print $1}'
#输出内容如下:
/tmp/1.txt
/tmp/1.txt
4.-f选项的使用,输出/etc/passwd文件总包含ops和包含root的行
username.txt的文件内容:
cat username.txt ---->user.txt作为样本文件
ops
root
#查询
#grep -f username.txt /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ops:x:1002:1002::/home/ops:/bin/bash
5.-i选项的使用,不区分大小写,找出test.txt文件中含有A或者a的行
test.txt的文件内容:
cat test.txt
A111
a111
B111
①不加-i选项
#grep 'a' test.txt
a111
②加-i选项
#grep -i 'a' test.txt
A111
a111
6.-n选项的使用,输出/etc/passwd文件中含有ops的行,并且输出该行行号
#grep -n "ops" /etc/passwd
27:ops:x:1002:1002::/home/ops:/bin/bash
7.-o选项的使用,输出test1.txt文件中的单词hello
test1.txt的文件内容:
cat test1.txt
hello world
my name is beijing
#grep -o "hello" test1.txt
hello ----->只输出模式匹配到的单词,而不是含有该单词的一整行
8.-v选项的使用,输出/etc/passwd文件中不含有/root/的行
#grep -v "root" /etc/passwd
9.-w选项的使用,输出test2.txt文件中含有interest的行
test2.txt的文件内容:
cat test2.txt
interest ghaha
interester ghaha
①不加-w选项
#grep "interest" test2.txt
interest ghaha
interester ghaha
②加上-w选项
#grep -w "interest" test2.txt
interest ghaha
10.\b边界符的使用,输出test2.txt文件中含有interest的行
#grep "\binterest\b" test2.txt
interest ghaha
11.-A选项的使用,输出/etc/passwd文件包含ops的行及其后面一行
#grep -A 1 "ops" /etc/passwd
ops:x:1002:1002::/home/ops:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
12.-B选项的使用,输出/etc/passwd文件包含ops的行及其前面一行
#grep -B 1 "ops" /etc/passwd
hahaha:x:1001:1001::/home/hahaha:/bin/bash
ops:x:1002:1002::/home/ops:/bin/bash
13.-C选项的使用,输出/etc/passwd文件包含ops的行及其前后各一行
#grep -C 1 "ops" /etc/passwd
hahaha:x:1001:1001::/home/hahaha:/bin/bash
ops:x:1002:1002::/home/ops:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
grep命令与正则结合使用
对正则不太理解的话可以看看这个:https://blog.csdn.net/weixin_44901564/article/details/99075443
1.提取/etc/passwd文件中以相同字母开头和结尾的行
#grep `"^\([[:alpha:]]\).*\1$"` /etc/passwd
#使用了正则分组及引用的知识,没有使用扩展正则,所以可以加不加-E选项都可以
2.提取网络配置文件 /etc/sysconfig/network-scripts/ifcfg-ens33中的所有ip
#grep -Eo "([[:digit:]]+\.){3}[[:digit:]]+" /etc/sysconfig/network-scripts/ifcfg-ens33
#使用了基本正则,扩展正则,分组与添加grep适当的选项
3.提取/etc/sysconfig/network-scripts/目录的上级目录名
#echo "/etc/sysconfig/network-scripts/" |egrep -o "/.*[^/]" |egrep -o "/.*/"
/etc/sysconfig/
分为两步提取,第一步是先删除最后一个"/",目的是方便第二次的匹配模式的确定,第二步直接提取