不知道大家是否有需要在一堆的源码文件里找某个特定的文本的需求,笔者就经常的需要。特别是在修改主题或者插件的时候这个需求特别的强烈,在Windows下一般都是锁定某个文件借助文本编辑器搜索来解决的,很明显这个方式最笨了,效率也是最低的,在Linux下这样的话很明显是不科学的,其实在Linux下命令行是无所不能的,像这种需求在Linux下实现基本就是命令行就可以应对了,今天笔者就来分享一下使用grep命令查找文件中的特定文本,最神奇的是可以说多个文件甚至是整个目录下的所有文件。
grep是一个最初用于Unix操作系统的命令行工具。在给出文件列表或标准输入后,grep会对匹配一个或多个正则表达式的文本进行搜索,并只输出匹配的行或文本。
下面借用几个grep命令的实际操作给大家分享一下具体的使用方法和各个参数的区别,至于结果就不贴出来了,大家只要知道对应的参数会输出什么结果即可,具体使用可以举一反三的。
以非递归方式查找具有特定字符串的所有文件
第一个命令示例将在/etc/目录下的所有文件中搜索字符串artful,同时排除任何子目录:
grep -s artful /etc/*
/etc/lsb-release:DISTRIB_CODENAME=artful
/etc/os-release:VERSION_CODENAME=artful
/etc/os-release:Ubuntu_CODENAME=artful
grep -s
选项将禁止关于不存在或不可读文件的错误消息。 输出显示文件名以及打印包含请求字符串的实际行。
递归地查找具有特定字符串的所有文件
以上命令省略了所有的子目录。 递归搜索意味着遍历所有的子目录。 以下命令将在/etc/目录内的所有文件(包括所有子目录)中搜索字符串artful:
grep -R artful /etc/*
搜索包含特定单词的所有文件
上面的grep命令示例列出了包含字符串artful的所有文件。 也显示了artfules,artfuled等。 使用grep -w选项只显示一个特定的单词:
grep -Rw artful /etc/*
仅列出包含特定文字的文件名称
上述命令可能会产生不必要的输出。 下一个示例将只递归地显示包含/etc/目录下的字符串artful的所有文件名:
grep -Rl artful /etc/*
执行不区分大小写的搜索
所有搜索默认情况下都区分大小写,这意味着任何搜索字符串的搜索都将只显示包含确切的大写和小写匹配的文件。 通过使用grep的-i选项,该命令还将列出包含Artful,STRETCH,ArtFul等的任何行,从而执行不区分大小写的搜索。
grep -Ril artful /etc/*
包含或排除搜索中的特定文件名称
使用grep命令也可以只包含特定的文件作为搜索的一部分。 例如,我们只想在扩展名为.conf的配置文件中搜索特定的文本/字符串。 下一个例子将在/etc目录下找到包含字符串bash的扩展名为.conf的所有文件:
grep -Ril bash /etc/*.conf
或者
grep -Ril --include=*.conf bash /etc/*
同样,使用--exclude
选项,我们可以排除任何特定的文件名:
grep -Ril --exclude=*.conf bash /etc/*
从搜索中排除特定的目录
与文件一样,grep也可以从搜索中排除特定的目录。 使用--exclude-dir
选项从搜索中排除目录。 以下搜索示例将在/etc目录中查找包含字符串artful的所有文件,并从搜索中排除/etc/grub.d:
grep --exclude-dir=/etc/grub.d -Rwl artful /etc/*
显示包含搜索字符串的行号
通过使用-n
选项,grep
还将提供有关特定字符串的行号的信息:
grep -Rni bash /etc/*.conf
找到所有不包含特定字符串的文件
最后一个例子将使用-v
选项来列出所有不包含特定关键字的文件。 例如,以下搜索将列出不包含字符串artful的/etc/目录中的所有文件:
grep -Rlv artful /etc/*