许多时候需要从一大堆的命令输出或文本内容中找出一两行关键的内容,例如从系统用户文件中查找某个用户。如果不借助工具,这将是一项非常繁琐的工作,这时可以使用grep工具对内容进行筛选。

grep(global regular expression print,全局正则表达式打印),来源于最早的行编辑器ed。grep是管理和维护系统时经常用到的一个工具。

一、grep的基本格式

命令格式:

grep [option] pattern [file(file-list)]

grep工具在文件file中查找与字符串pattern匹配的内容,如果找到,则将整行输出到标准输出。

常用选项:

i:忽略大小写。

n:将结果输出的同时,也输出该行的行号。

s:在没有找到匹配的内容时,不显示错误信息。

l:从多个文件中查找时,只输出找到匹配内容的文件名称。

h:从多个文件中查找时,只输出匹配的内容,不显示文件名称。

c:只输出匹配内容的总行数。

v:反转查找,即输出匹配内容以外的行。

grep工作时,总是以行为单位查找。首先将文本的第1行读入缓冲区并执行查找,如果找到匹配的字符串,则输出整行。否则就丢弃缓冲区内容并读入下一个文本行继续查找,直到文本结束。

二、使用grep查找文本

示例文本文件students内容如下:

[root@localhost zhu]# cat students
Liulu Sichuan Lixia //
Liumin Henan lixia //
Xuli Jiangsu Luolei //
Xiayu Shanxi Hetao //
Liwei Sichuan tangwei //
Heli Xizang Tangwei //
Wangtao Yunnan Huli //

(1)查找关键字

[root@localhost zhu]# grep "" students
Xuli Jiangsu Luolei //
Xiayu Shanxi Hetao //
Liwei Sichuan tangwei //
Heli Xizang Tangwei //

(2)显示行号

[root@localhost zhu]# grep -n "" students
: Xuli Jiangsu Luolei //
: Xiayu Shanxi Hetao //
: Liwei Sichuan tangwei //
: Heli Xizang Tangwei //

(3)统计结果

[root@localhost zhu]# grep -c "Xizang" students

(4)大小写敏感

[root@localhost zhu]# grep "tangwei" students
Liwei Sichuan tangwei //
[root@localhost zhu]# grep "Tangwei" students
Heli Xizang Tangwei //
#使用选项i查找时忽略大小写
[root@localhost zhu]# grep -i "tangwei" students
Liwei Sichuan tangwei //
Heli Xizang Tangwei //

(5)反转查找

查询辅导员不是Tangwei和Lixia的学生情况:

[root@localhost zhu]# grep -vi "tangwei" students | grep -vi "lixia"
Xuli Jiangsu Luolei //
Xiayu Shanxi Hetao //
Wangtao Yunnan Huli //

这条命令中的第一个grep先输出不含有Tangwei的所有行,然后通过管道将结果传递给第二个grep命令,第二个命令输出不含有Lixia的所有行。

(6)多文件查找

有时候需要从多个文件中查找一些相关联的内容,这时就要用到多文件查询。例如管理员要从目录/etc的文件中查找有关root用户的内容:

[root@localhost zhu]# grep -l "root" /etc/*
/etc/aliases
/etc/aliases.db
/etc/anacrontab
/etc/crontab
/etc/gpm-root.conf
/etc/group
...

grep输出了目录/etc中所有含有root字符串的文件名。

查询密码文件/etc/passwd和影子文件/etc/shadow中含有字符串root的所有行,并且不显示文件名称:

[root@localhost zhu]# grep -h "root" /etc/passwd /etc/shadow
root:x:::root:/root:/bin/bash
operator:x:::operator:/root:/sbin/nologin
root:$$t4$eOBy2Gb9IAyS.1WiFU1bU.:::::::

(7)在命令输出和变量中查找

grep不仅可以从文件中查询字符串,还可以从字符串和字符串变量中查询:

#使用grep在命令输出中查找
[root@localhost zhu]# echo "Welcome to Beijing" | grep "to Beijing"
Welcome to Beijing
#使用grep在变量中查找
[root@localhost zhu]# A="Welcome to Beijing"
[root@localhost zhu]# echo $A | grep "Beijing"
Welcome to Beijing
#使用变量保存查找的字符串
[root@localhost zhu]# A="Beijing"
[root@localhost zhu]# echo "Welcome to Beijing" | grep "$A"
Welcome to Beijing

注意:在使用grep查找时,被查找的字符串可以不使用引号。但在被查找的字符串中有空格或被查询的字符串保存在一个变量中时,应该使用引号以免被grep误解为一个命令或参数。

三、行首、行尾匹配查找

文本的行首、行尾通常用于保存特殊意义的字段,例如产品序号、销售额等内容,因此从行首和行尾匹配查找可能会比较频繁。

1、行首匹配

查询文件students中所有2008年入学的学生:

[root@localhost zhu]# grep '^28' students
Liulu Sichuan Lixia //
Liumin Henan lixia //

使用行首匹配显示第5、6个字符为02的所有行:

[root@localhost zhu]# grep '^....02' students
Liulu Sichuan Lixia //
Liumin Henan lixia //
Xuli Jiangsu Luolei //
Xiayu Shanxi Hetao //

2、行尾匹配

例如查找平均成绩85以上的学生情况:

[root@localhost zhu]# grep -v '[0-7][0-9]$' students | grep -v '8[0-4]$'
Liwei Sichuan tangwei //

当然也可以配合常用的正则表达式查找。

四、使用或、与多模式匹配查找

(1)或匹配模式

使用参数E让grep命令将要匹配的字符串延伸为一个普通的表达式,此时可以使用“|”表示或匹配模式,即只需要匹配两个字符串中的任意一个即可。

例如查询来自河南和云南学生的详细情况:

[root@localhost zhu]# grep -E 'Henan|Yunnan' students
Liumin Henan lixia //
Wangtao Yunnan Huli //

(2)与模式匹配

然而参数E并不支持与匹配模式查询,此时可以使用多条件管道实现。例如要查询名叫Lixia的学生中有哪些来自Sichuan:

[root@localhost zhu]# grep -i "Lixia" students | grep "Sichuan"
Liulu Sichuan Lixia //

五、grep工具应用实例

1、精简配置文件

在Linux系统中,管理员经常接触到各种类型的服务器配置文件。这些配置文件通常都使用了一个通用的注释格式,即使用井号“#”(通常是注释信息)或“;”(通常标志该行是默认设置)作为开头标志。配置文件中的注释信息和默认配置语句行写得非常详细,这些语句行比真正起作用的配置往往多出数十倍,甚至更多。

通常情况下,熟悉这些配置文件的管理员会使用grep工具的参数v精简这些配置文件,让这些配置文件的可读性更高,更方便修改。此处以精简Samba服务器的配置文件smb.conf为例:

[root@localhost zhu]# cp /etc/samba/smb.conf ./
[root@localhost zhu]# mv smb.conf smb.conf_backup
[root@localhost zhu]# cat smb.conf_backup | grep -v '#' | grep -v '^;' | grep -v '^$' >smb.conf

2、从系统管理命令输出中查找

grep工具是Linux中最常用的命令之一,管理员需要经常使用它对命令结果执行筛选,以便查看关键内容。

例如从服务列表中筛选出蓝牙服务,以便于查看这个服务在不同运行级别中的启动状态:

[root@localhost zhu]# chkconfig --list | grep bluetooth
bluetooth :off :off :on :on :on :on :off

查找文本工具grep的更多相关文章

  1. Linux查找命令:grep,awk,sed

    grep grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具 ...

  2. 24-Ubuntu-文件和目录命令-查找文件内容-grep

    grep Linux系统中grep命令是一种强大的文本搜索工具. grep允许文本文件进行模式查找,所谓模式查找,又被称为正则表达式. 选项 含义 -n 显示匹配行及行号 -v 显示不包括匹配文本的所 ...

  3. 查找命令中grep,find,which和whereis的使用及区别

    在linux系统中,许多时候需要查找某些文件或者字符,如果用ls, cd 等基础命令就显得很无力了,那么Linux提供了grep,find,which 三种查找命令,在这里我记录一下: 一.grep命 ...

  4. Linux命令-文件文本操作grep

    文件文本操作 grep 在文件中查找符合正则表达式条件的文本行 cut 截取文件中的特定字段 paste 附加字段 tr 字符转换或压缩 sort 调整文本行的顺序,使其符合特定准则 uniq 找出重 ...

  5. 我的运维之旅-查找文本的linux命令

    小伙伴们肯定都遇到这么尴尬场景,线上服务出问题了,老大一直在问什么问题导致的,而你由于对查找文本的命令不太熟,鼓捣了半天才找到那条 异常日志,而这时可能半个小时都已经过去了.老大可能对你失望透顶了.讲 ...

  6. [转帖]linux下的find文件查找命令与grep文件内容查找命令

    linux下的find文件查找命令与grep文件内容查找命令 https://www.cnblogs.com/shileima/p/8431393.html 在使用linux时,经常需要进行文件查找. ...

  7. android html 图片处理类--加载富文本工具类

    在android开发中,一些资讯类页面,里面有html标签和图片,html 标签一般通过Html.fromHtml方法,即可以解决,但是如果html 有图片标签,那么,Html.fromHtml 好像 ...

  8. NSIS查找文本中是否包含某个字串

    !include "textfunc.nsh"!include "logiclib.nsh"OutFile "find.exe"#文本文件a ...

  9. 三大文本处理工具grep、sed及awk的简单介绍

    grep.sed和awk都是文本处理工具,虽然都是文本处理工具单却都有各自的优缺点,一种文本处理命令是不能被另一个完全替换的,否则也不会出现三个文本处理命令了.只不过,相比较而言,sed和awk功能更 ...

随机推荐

  1. Linux下burg引导

    用得比较久了,比grub顺手: 安装: sudo add-apt-repository ppa:n-muench/burg; sudo apt-get update; sudo apt-get ins ...

  2. java 继承 String类

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha String 类 是 final修饰 , 是不能 继承的.

  3. [BZOJ4026]dC Loves Number Theory(线段树)

    根据欧拉函数的定义式可知,可以先算出a[l]*a[l+1]*...*a[r]的值,然后枚举所有存在的质因子*(p-1)/p. 发现这里区间中一个质因子只要计算一次,所以指计算“上一个同色点在区间外”的 ...

  4. Eclipse下使用Stanford CoreNLP的方法

    源码下载地址:CoreNLP官网. 目前release的CoreNLP version 3.5.0版本仅支持java-1.8及以上版本,因此有时需要为Eclipse添加jdk-1.8配置,配置方法如下 ...

  5. Java并发(七):双重检验锁定DCL

    双重检查锁定(Double Check Lock,DCL) 1.懒汉式单例模式,无法保证线程安全: public class Singleton { private static Singleton ...

  6. bzoj 1625: [Usaco2007 Dec]宝石手镯

    Description 贝茜在珠宝店闲逛时,买到了一个中意的手镯.很自然地,她想从她收集的 N(1 <= N <= 3,402)块宝石中选出最好的那些镶在手镯上.对于第i块宝石,它的重量为 ...

  7. mvc-单例多线程模式

    以spring mvc 为例子 spring mvc 的Controller类默认Scope是单例(singleton) 测试结果发现spring3中的controller默认是单例的,若是某个con ...

  8. Linux下swap分区多大才合适的问题探讨

    说明: 1.这个话题在每个Linux发行版中都各不相同,且在当下内存硬盘的时代下,再组个磁盘阵列之后速度相当. 2.我觉得硬盘大的情况下,有多大搞多大,我只要控制内存的使用率在99%时才使用swap, ...

  9. Codeforces Round #247 (Div. 2) ABC

    Codeforces Round #247 (Div. 2) http://codeforces.com/contest/431  代码均已投放:https://github.com/illuz/Wa ...

  10. 解决office2007-安装程序找不到office.zh-cn\Setup.xml

    安装Microsoft Office Project Standard 2007时出现了小问题,经过百度google一番后才发现安装office2007与安装vs2008有着紧密的联系,参见:http ...