Linux文本处理三剑客之grep详解

一、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/
分为两步提取,第一步是先删除最后一个"/",目的是方便第二次的匹配模式的确定,第二步直接提取

猜你喜欢

转载自blog.csdn.net/weixin_44901564/article/details/104556127