grep 命令系列:如何在 Linux/UNIX 中使用 grep 命令

grep 命令系列:如何在 Linux/UNIX 中使用 grep 命令

我该怎样在 Linux、Apple OS X 及其他类 UNIX 系统中使用 grep 命令,你能给我展示一些简单的例子吗?

grep 命令用来搜索文本,或从给定的文件中搜索行内包含了给定字符串或单词的文件。通常来说,grep 显示匹配到的行。使用 grep 来搜索包括一个或多个正则表达式匹配到的文本行,然后只显示匹配到的行。grep 被视作在 Linux/ Unix 系统中最有用的命令之一。

你知道吗

grep 这个名字,来源于一个 Unix/Linux 中的古老的行编辑器 ed 中执行相似操作的命令:


  1. g/re/p

grep 命令的语法

语法如下所示:


  1. grep 'word' 文件名
  2. grep 'word' 文件1 文件2 文件3
  3. grep 'word1\|word2' 文件名
  4. cat 某个文件 | grep '某个东西'
  5. command | grep '某个东西'
  6. command 选项1 | grep '数据'
  7. grep --color '数据' 文件名

怎么样使用 grep 来搜索一个文件

搜索 /etc/passwd 文件下的 boo 用户,输入:


  1. $ grep boo /etc/passwd

输出内容:


  1. foo:x:1000:1000:foo,,,:/home/foo:/bin/ksh

可以使用 grep 去强制忽略大小写。例如,使用 -i 选项可以匹配 boo, Boo, BOO 和其他组合:


  1. $ grep -i "boo" /etc/passwd

递归使用 grep

你可以递归地使用 grep 进行搜索。例如,在文件目录下面搜索所有包含字符串“192.168.1.5”的文件


  1. $ grep -r "192.168.1.5" /etc/

或者是:


  1. $ grep -R "192.168.1.5" /etc/

示例输出:


  1. /etc/ppp/options:# ms-wins 192.168.1.50
  2. /etc/ppp/options:# ms-wins 192.168.1.51
  3. /etc/NetworkManager/system-connections/Wired connection 1:addresses1=192.168.1.5;24;192.168.1.2;

你会看到搜索到 192.168.1.5 的结果每一行都前缀以找到匹配的文件名(例如:/etc/ppp/options)。输出之中包含的文件名可以加 -h 选项来禁止输出:


  1. $ grep -h -R "192.168.1.5" /etc/

或者


  1. $ grep -hR "192.168.1.5" /etc/

示例输出:


  1. # ms-wins 192.168.1.50
  2. # ms-wins 192.168.1.51
  3. addresses1=192.168.1.5;24;192.168.1.2;

使用 grep 去搜索文本

当你搜索 boo 时,grep 命令将会匹配 fooboo,boo123, barfoo35 和其他所有包含 boo 的字符串,你可以使用 -w 选项去强制只输出那些仅仅包含那个整个单词的行(LCTT译注:即该字符串两侧是英文单词分隔符,如空格,标点符号,和末端等,因此对中文这种没有断字符号的语言并不适用。)。


  1. $ grep -w "boo" file

使用 grep 命令去搜索两个不同的单词

使用 egrep 命令如下:


  1. $ egrep -w 'word1|word2' /path/to/file

(LCTT 译注:这里使用到了正则表达式,因此使用的是 egrep 命令,即扩展的 grep 命令。)

统计文本匹配到的行数

grep 命令可以通过加 -c 参数显示每个文件中匹配到的次数:


  1. $ grep -c 'word' /path/to/file

传递 -n 选项可以输出的行前加入匹配到的行的行号:


  1. $ grep -n 'root' /etc/passwd

示例输出:


  1. 1:root:x:0:0:root:/root:/bin/bash
  2. 1042:rootdoor:x:0:0:rootdoor:/home/rootdoor:/bin/csh
  3. 3319:initrootapp:x:0:0:initrootapp:/home/initroot:/bin/ksh

反转匹配(不匹配)

可以使用 -v 选项来输出不包含匹配项的内容,输出内容仅仅包含那些不含给定单词的行,例如输出所有不包含 bar 单词的行:


  1. $ grep -v bar /path/to/file

UNIX/Linux 管道与 grep 命令

grep 常常与管道一起使用,在这个例子中,显示硬盘设备的名字:


  1. # dmesg | egrep '(s|h)d[a-z]'

显示 CPU 型号:


  1. # cat /proc/cpuinfo | grep -i 'Model'

然而,以上命令也可以按照以下方法使用,不使用管道:


  1. # grep -i 'Model' /proc/cpuinfo

示例输出:


  1. model : 30
  2. model name : Intel(R) Core(TM) i7 CPU Q 820 @ 1.73GHz
  3. model : 30
  4. model name : Intel(R) Core(TM) i7 CPU Q 820 @ 1.73GHz

如何仅仅显示匹配到内容的文件名字?

使用 -l 选项去显示那些文件内容中包含 main() 的文件名:


  1. $ grep -l 'main' *.c

最后,你可以强制 grep 以彩色输出:


  1. $ grep --color vivek /etc/passwd

示例输出:

本文来自合作伙伴“Linux中国”

原文发布时间为:2013-04-02.

时间: 2024-12-08 16:14:47

grep 命令系列:如何在 Linux/UNIX 中使用 grep 命令的相关文章

如何在 Linux 系统中创建一个云端加密文件系统

如何在 Linux 系统中创建一个云端加密文件系统 Amazon S3 和 Google Cloud Storage 之类的商业云存储服务以能承受的价格提供了高可用性.可扩展.无限容量的对象存储服务.为了加速这些云产品的广泛采用,这些提供商为他们的产品通过明确的 API 和 SDK 培养了一个良好的开发者生态系统.而基于云的文件系统便是这些活跃的开发者社区中的典型产品,已经有了好几个开源的实现. S3QL 便是最流行的开源云端文件系统之一.它是一个基于 FUSE 的文件系统,提供了好几个商业或开

Linux/Unix中的load average

使用top命令时,我们会看到第一行有个 1 load average: 0.01, 0.01, 0.00 当然,别的命令也看的到,比如uptime,w. 使用strace追踪uptime很容易发现这三个数据来自/proc/loadavg文件.另几个命令也是通过读取这个文件得到的. 1 $ strace -eopen uptime 2 #省略掉无关内容 3 open("/proc/loadavg", O_RDONLY)         = 4 load average是什么: 三个数字分

如何在 Linux/Unix/Mac 下清除 DNS 查询缓存

如何在 Linux/Unix/Mac 下清除 DNS 查询缓存 我在Linux下使用拨号连接上网,频繁的拨号断线造成DNS的问题.我如何在Linux/Unix发行版下使用shell命令清除DNS缓存? 在MS-Windows下,你可以使用ipconfig命令来清除dns缓存.然而,Linux和Unix提供了不同的方法来清除缓存.Linux可以运行 nscd 或者 BIND 或者 dnsmasq 作为名称服务缓存守护进程.大型或者工作组服务器可能使用BIND或者dnsmasq作为专用缓存服务器来加

教你如何在Linux/Unix平台安装MySQL

mysql|unix [导读]介绍如何在Linux/Unix平台下安装MySQL. Linux下的安装步骤: 推荐使用RPM工具来进行Linux下的MySQL数据库安装.目前的MySQL rpm安装文件包是在SuSE Linux 7.3系统平台上打造而成的,但是在绝大多数支持RPM和glibc的其他Linux平台中也可以进行安装.如果选择通用的RPM安装包,那么RPM将静态链接到Linux的线程中.下面步骤执行了一个标准的最小化安装: shell> rpm -i MySQL-server-VER

如何在linux上分享你shell命令的输出

如何在linux上分享你shell命令的输出 前段时间我发布了一篇关于shelr.tv这个网站的文章,它提供一个服务允许你从网站上直接分享你的终端记录. 现在shelr.tv这个网站似乎关闭了,然后我四处寻找是否有类似的网站,于是我发现了commands.com. 从它的主页上来看,它的服务和其他网站提供的服务是类似的,因此让我们来测试它. 步骤 1 – 在网站上注册 只需要注册一个新的 用户名/密码,或者直接使用你的github账户快速登录. 步骤 2 – 下载安装monitor程序 Moni

如何在Linux终端中修复U盘驱动器问题

U 盘想必在大家的日常生活和工作中都已经不可或缺了,它让我们的文件维护和转移更加方便容易.但随着频繁使用,有可能会出现文件系统错误.坏块.坏扇区而影响正常使用的情况.对于 Windows 用户来说,修复此类 U 盘问题有专用的图形化工具使用,而 Linux 用户就相对麻烦一点,本文我们就介绍如何在 Linux 终端中修复 U 盘问题. 当然,本文中介绍的方法不仅适用于 USB 驱动器,同时也适用于其它接口类型的硬盘.但在操作前请自行对重要数据进行备份,自己的数据自己负责. 使用fsck移除U盘中

ubuntu-如何在linux系统中实现传递访问请求

问题描述 如何在linux系统中实现传递访问请求 有一台linux(ubuntu)主机,双网卡.eth1和eth2分别接到两个不同的网段1和网段2". 另一台Web服务,位于网段2. 我需要实现的是,用网段1中其它主机的浏览器向Linux发请求,请求会被转发到网段2中的Web服务器.让linux看起来就是Web服务. 请问这个需求如何实现? 解决方案 ngnix反向代理,负载平衡 解决方案二: 机器上设置iptable来设置路由转发规则

linux基础-linux 脚本中的复制命令

问题描述 linux 脚本中的复制命令 linux 脚本里的复制命令执行后,复制的文件显示的问号,文件大小与复制的文件大小相同,谢谢 解决方案 是不是有中文,设置一下你的本地语言? 解决方案二: 文件格式要保持一致

PHP/如何在Linux服务器中隐藏PHP版本

通常,大多数默认设置安装的web服务器存在信息泄露,这其中之一就是PHP.PHP 是如今流行的服务端html嵌入式语言(之一?).在如今这个充满挑战的时代,有许多攻击者会尝试发现你服务端的漏洞.因此,我会简单描述如何在Linux服务器中隐藏PHP信息. 默认上expose_php默认是开的.关闭"expose_php"参数可以使php隐藏它的版本信息. [root@centos66 ~]# vi /etc/php.ini 在你的php.ini, 定位到含有expose_php的那行把O