Linux中grep命令总结

grep是每个Linux发行版都预装的一个强有力的文件模式搜索工具。无论何种原因,如果系统没有预装它的话,可以通过系统的包管理器来安装它(Debian/Ubuntu系中的apt-get和RHEI/CentOS/Fedora系中的yum)

sudo apt-get install grep
#sudo yum install grep

1. 搜索和寻找文件
例:假设你已经在你的电脑上安装了一个全新的Ubuntu,然后你打算卸载Python。你浏览网页寻找教程,但是你发现存在两个不同版本的Python在使用,而你不知道你的Ubuntu安装器到底在你的系统中安装了哪个版本的Python,也不知道它安装了哪些模块。解决这个烦恼只需简单的运行以下命令:

sudo dpkg -l | grep -i python

dpkg -l列出系统中安装的.deb包。接着使用管道将输出的结果传输给命令grep -i python,这一步可以简单解释为把结果传输给grep然后过滤出所有含有python的项,并返回结果。-i选项用于忽略大小写,因为grep是大小写敏感的,使用选项-i是个好习惯,除非打算进行更细节的搜索。


2. 搜索和过滤文件
例:假设你需要输出文件中除注释以外的代码,即去除带有“//”的行

sudo grep -v "//" 1.txt

选项-v是告诉grep命令反转它的输出结果,意思就是不输出匹配的项,做相反的事,打印出所有不匹配的项。上边的例子有“//”的注释行(其实这个命令并不准确,包含“//”的行不全是注释行。关于如何精确匹配注释行,可以了解正则表达式相关内容)。


3. 找出所有mp3文件
例:假设一个文件夹里全是各种格式的音乐文件。你要找出jay的所有mp3格式的音乐文件,而且里面不要有任何混合音轨的。那么使用find命令再结合管道使用grep命令就可以完成。

sudo find . -name ".mp3" | grep -i jay | grep -vi "remix"

使用find命令打印出所有以.mp3为后缀名的文件,接着将其使用管道传递给grep -i过滤和打印出名字为“jay”的文件,再使用管道传送给grep -vi以便过滤掉含有“remix”的项。


4. 在搜索字符串前面或者后面显示行号
例:假设需要显示ifconfig中从inet6开始的后面4行,以及从UP开始的前面2行

sudo ifconfig | grep -A 4 inet6

输出

          inet6 地址: fe80::d68d:1bf7:bdf6:8afe/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  跃点数:1
          接收数据包:155951 错误:0 丢弃:0 过载:0 帧数:0
          发送数据包:46307 错误:0 丢弃:0 过载:0 载波:0
          碰撞:0 发送队列长度:1000 
--
          inet6 地址: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  跃点数:1
          接收数据包:292 错误:0 丢弃:0 过载:0 帧数:0
          发送数据包:292 错误:0 丢弃:0 过载:0 载波:0
          碰撞:0 发送队列长度:1000 
sudo ifconfig | grep -B 2 UP

输出

          inet 地址:192.168.64.128  广播:192.168.64.255  掩码:255.255.255.0
          inet6 地址: fe80::d68d:1bf7:bdf6:8afe/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  跃点数:1
--
          inet 地址:127.0.0.1  掩码:255.0.0.0
          inet6 地址: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  跃点数:1

-A和-B的切换,是用以显示匹配的行以及行号,分别控制在字符串前或字符串后显示的行数。可以简单认为-A=after,-B=before


5. 在匹配字符串周围打印出行号
例:显示ifconfig中lo前后2行。

sudo ifconfig | grep -C 2 lo

输出

          接收字节:230913893 (230.9 MB)  发送字节:3016795 (3.0 MB)

lo        Link encap:本地环回  
          inet 地址:127.0.0.1  掩码:255.0.0.0
          inet6 地址: ::1/128 Scope:Host

选项-C与之前的-A和-B相似,它是显示目标前后n行的内容,可以认为-C=center


6. 计算匹配项的行数
例:显示ifconfig中包含inet6的行数

sudo ifconfig | grep -c inet6

7. 按给定字符串搜索文件中匹配的行号及内容

sudo grep -n "class" 1.txt

8. 在所有目录里递归的搜索
例:假设要在当前文件夹里搜索一个字符串,而当前文件夹里又有很多子目录,你可以置顶一个-r选项以便于递归的搜索

 sudo grep -r "function" *

9. 进行精确匹配搜索

sudo grep -w "class" 1.txt

上面的例子,是在1.txt文件中搜索class这个单词,并输出class所在行的内容,由于这是精确搜索(包含要搜索的单词,而不是通配),所以如果是“clas”,可能就不会输出任何内容。


10. 在Gzip压缩文件中搜索
grep还有衍生应用,第一个就是zgrep,这个与zcat很相似,可以用于gzip压缩过的文件,它有与grep相似的命令选项,使用方式也一样。

sudo zgrep -i error /var/log/syslog.2.gz

11. 在文件中匹配正则表达式
egrep是另一个衍生应用,代表“扩展全局正则表达式”。它可以识别更多的正则表达式元字符,如at + ? | 和()。在搜索源代码文件时,egrep是一个非常有用的工具,还有其他的一些零碎代码文件的搜索需要,使得这样的搜索能力成为必需,可以在grep命令中使用选项-E来启用它。

sudo grep -E

12. 搜索一个固定匹配字符串
fgrep用于在一个文件或文件列表中搜索固定样式的字符串。功能与grep -F同。fgrep的一个通常用法为传递一个含有样式的文件给它

sudo fgrep -f file_full_of_patterns.txt file_to_search.txt
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值