热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

grep技巧(r):在某一目录下递归[所有子目录]查找某一字串:+文件路径

转自:http:zhumeng8337797.blog.163.comblogstatic1007689142011350151438在某一目录下递归[所有子目录]
转自:
http://zhumeng8337797.blog.163.com/blog/static/1007689142011350151438/

在某一目录下递归[所有子目录]查找某一字串:
grep -r “字串” 目录名

就是加一个-r参数,请看man page:

-R, -r, –recursive
Read all files under each directory, recursively; this is equivalent to the -d recurse option.


grep -Rl "3306" * 这句可以显示在哪个文件里包含3306  

grep -REn "3306" * 可以显现文件名,行数 

R 表示递归,就是在当前目录找不到就去子目录找 

E 表示把文件名也打印出来 

n 打印此行在文件中的位置。


Unix grep家族包括grep,egrepfgrepGrep的命令在文件中搜索正则表达式,并打印所有包含这些表达式的行。Egrepfgrep命令只跟grep有很小的不同。Egrepgrep的扩展,支持更多的RE元字符。Fgrep就是fixed grep 或者 fast grep,它们把所有的字母都看作单词。这就是说,正则表达式的元字符不再特殊――他们只表示其自身的字母意思。


Grep的意思是“全面搜索正则表达式并把找到的行打印出来(global search regular expression(RE) and print out the line)。

Grep的正则表达式元字符集(基本集)

元字符

功能

例子

匹配什么

^

锚定行的开始

/^love/

匹配所有以love开头的行

$

锚定行的结束

/love$/

匹配所有以love 结束的行

.

匹配一个字符

/l..e/

匹配这样的行,这些行包含这样的字符:第一个字符是l,紧跟着两个字符,然后是e

*

代表0个或多个先前字符

/*love/

匹配所有这样的行,有0个或多个空格,空格后跟着love

[]

匹配字符组中的一个字符

/[Ll]ove/

匹配所有包含love或者Love的行

[^]

匹配一个不在范围内的字符

/[^A-Z]ove/

<

锚定单词的开始

匹配所有这样的行&#xff0c;这些行包含以love开头的单词&#xff08;vigrep支持这个功能&#xff09;

>

锚定单词的结束

Love>

匹配所有这样的行&#xff0c;这些行包含以love结束的单词&#xff08;vigrep支持这个功能&#xff09;

(..)

标记后面用到的匹配字符

/(love)able1rs/

最多可以使用9个标签。第一个标签是模板最左边的部分。在本例子中&#xff0c;模板love保存的标签为1&#xff0c;后面的1指得就是love&#xff1b;本例子搜索的是这样的行&#xff0c;这些行包含这样的字符&#xff0c;在Loveabel后面跟着lovers

x{m}

M次复制字符x

x{m,}

至少m次复制字符x

x{m,n}

至少m次&#xff0c;至多n次复制字x

w

文字和数字字符&#xff0c;[A-Za-z0-9]

Lw*e

匹配一个l字符&#xff0c;紧跟着0个或多个文字或数字字符&#xff0c;然后是e

W

同上

b

单词分界线

bloveb

仅仅匹配单词love

扩展集&#xff08;用于egrepgrep-E&#xff09;

&#43;

匹配一个或者多个先前字符

[a-z]&#43;ove

匹配一个或者多个小写字符且后面是ove的&#xff0c;

?

匹配0个或者多个先前字符

Lo?ve

P匹配l后面有一个或者没有o&#xff0c;然后是ve

a|b|c

匹配abc

Love|hate

匹配lovehate其中一个

&#xff08;&#xff09;

字符组

Love(able|rs)(ov)&#43;

匹配loveablelovers,匹配一个或多个ov

(…)(…)12

标记匹配字符串

(love)ing

标签标记出寄存器的一部分&#xff0c;并稍后替换模板。该模板叫做1,并可反复引用。在表达式中最多可以使用9个这样的标签。例如&#xff0c;模板love被保存在寄存器1中并稍后替换标签叫做1

x{m}

重复字符X,m次&#xff0c;至少m,或者m次和n次之间。

x{m,}

x{m,n}



Grep和退出状态


Grep命令在shell教本中非常有用&#xff0c;因为它通过返回一个退出状态值来说明是否找到了你要搜索的模板或者文件。如果模板找到&#xff0c;grep返回状态值0&#xff0c;表示成功&#xff1b;如果无法找到模板&#xff0c;则返回退出状态值1&#xff1b;如果文件无法找到&#xff0c;就返回退出状态值2&#xff08;linuxunix使用的其他搜索程序并不返回退出状态值&#xff0c;只在出现语法错误的时候返回错误&#xff09;。

[posftp&#64;SZTrade posftp]$ grep &#39;john&#39; /etc/passwd

[posftp&#64;SZTrade posftp]$ echo $?

1

[posftp&#64;SZTrade posftp]$echo $status

Grep与选项

Gun grep 选项

-b 在搜索到的行为的前面打印该行所在的块号码。该功能在通过内容定位块的号码时非常有用.

-c 只显示有多少行匹配&#xff0c;而不具体显示匹配的行

 -h 不显示文件名

 -I 在字符串比较的时候忽略大小写

 -l 只显示包含匹配模板的行的文件名清单&#xff0c;不同项目之间用换行符分割

 -n 在每一行前面打印该行在文件中的行数

-s 静默工  作&#xff0c;除非出现错误信息&#xff0c;否则不打印任何信息&#xff0c;这个功能在检测退出状态的时候有用

 -v 反检索&#xff0c;只显示不匹配的行

-w 如果被>引用&#xff0c;就把表达式做为一个单词搜索只在grep中 有效&#xff08;不是所有版本的grep都支持该特性&#xff0c;sco unixgrep就不支 持&#xff09;

所有gun干部都可以使用的grep选项&#xff08;-G,-E-F&#xff09;

选项

功能

-#

表示同时显示匹配上下的&#xff03;行&#xff0c;例如&#xff1a;grep -2 pattern filename 表示同时显示匹配行上下各两行

-A#,--after-context&#61;#

在匹配指定的内容的行打印完毕后&#xff0c;再打印一行&#xff03;号

-B#,--before-context&#61;#

在匹配模板的行的前面打印一行&#xff03;号

-C,--context

相当于选项&#xff0d;2&#xff0c;在匹配行的前后各打印2行空行

-V,--version

显示包括bug报告在内的版本信息

-b,--byte-offset

在每一行前面打印字符偏移量

-c,--count

打印每个文件匹配行的个数

-e PATTERN,--regexp&#61;PATTERN

使用PATTERN的字面意思作为模板&#xff0c;在模板以“-”开头的时候非常有用

-f FILE,--file&#61;FILE

FILE中提取模板。空文件中包含0个模板&#xff0c;所有什么也不匹配

-h,--no-filename

当多个文件匹配时候&#xff0c;不显示匹配文件名前缀

-i,--ignore-case

在模板和输入文件中都忽略大小写差别

-L,--files-without-match

打印不匹配模板的文件名清单

-I,--files-with-matches

打印匹配模板的文件名清单

-n,--line-number

在匹配的行前面打印行号

-q,--quit

取消标准输出&#xff0c;跟-n功能是一样的

-s,--silent

不显示关于不存在或者无法读取文件的错误信息

-v,--revert-match

打印不匹配模板的行

-w,--word-regexp

只打印以单词形式匹配模板的行&#xff0c;模板可以是包含数字&#xff0c;字符和下划线的字符集

-x,--line-regexp

只打印正行匹配的行

-y

用法同-i

-U,--binary

把文件作为二进制文件&#xff0c;这个选项只在MS-DOSMS-Windows中被支持

-u,--unix-byte-offsets

按照unix风格报告字符偏移量。只在-b选项同时被使用的时候才有效。这个选项只在MS-DOSMS-Windowns中被支持

例子&#xff1a;

grep Tom /etc/passwd

在文件/etc/passwd中搜索模板Tom,如果成功&#xff0c;搜索的行将显示在屏幕上。

Ps aux | grep root

Ps命令输出&#xff08;pa aux显示系统中运行的所有进程&#xff09;被发送给grep,所有包含root的行都将被打印。

正则grep实例&#xff08;grep ,grep –G&#xff09;

grep NW datafile

grep –G NW datafile

打印文件datafile中包含正则表达式NW的行

grep NW d*

打印所有以开头的文件中且包含正则表达式NW的行。Shell扩展d*表示所有以d开头的文件。

Grep ‘^n’ datafile

打印所有以n开头的行&#xff0c;^表示锚定行的开头。

Grep TB Savage datafile

因为第一个参数是模板&#xff0c;其他的参数是文件名&#xff0c;所以grep将在文件Savagedatafile中搜索TB.

Grep ‘TB Savage’ datafile

打印所有包含模板TB Savage的行。如果没有引用&#xff08;在本例子中&#xff0c;单引号和双引号的作用是一样的&#xff09;。TBSavage之间的空格将导致grep在文件Savagedatafile中搜索TB

Gun grep选项例子

grep -2 patricia datafile

打印匹配patricia的行以及该行的上下各两行。

Grep –C patricia datafile

选项&#xff0d;C跟选项&#xff0d;2的功能是一样的。

Grep –A 2 patricia datafile

Grep打印匹配patricia的行已经该行的下两行。

Grep –b ‘[abc]’ datafile

选项-b使得grep在打印每一行前打印字符偏移量。



grep的一般格式为&#xff1a; 
               grep [选项] pattern [文件]单引号和双引号&#xff1a;
1&#xff09;在grep命令中输入字符串参数时&#xff0c;最好将其用双引号括起来。例如&#xff1a;“my strings”&#xff0c;这样做有两个原因&#xff0c;一个是防止被误会是shell命令&#xff0c;一个是可以用来查找多个单词组成的字符串&#xff0c;就如这个例子中的“my strings”。2&#xff09;在调用变量的时候&#xff0c;也应该使用双引号&#xff0c;例如&#xff1a;grep “$MYNAME”。3&#xff09;在调用模式匹配(正则表达式&#xff09;时&#xff0c;应该使用单引号

egrep和grep
egrep:  grep 的扩充版本改良了许多传统 grep 不能或不便的操作比方说
- grep 
之下不支持 ?  &#43; 这两种 modifier,  egrep 则可
- grep 
不支持 a|b  (abc|xyz) 这类"或一"比对 egrep 则可
- grep 
在处理 {n,m} 需用 \{  \} 处理 egrep 则不需
         所以egrep就不用grep... ^_^ &#xff0c;可以加选项 -E 来使grep具有egrep的功能
   关于egrep和grep在正则方面的区别&#xff0c;请参考文章各种工具之正则表达式语法比较

返回状态&#xff1a;匹配&#xff1a;0             不匹配&#xff1a;1        文件不可访问或语法错误&#xff1a;2
◎参数 1&#xff1a;-A NUM &#xff1a;除了列出符合行之外&#xff0c;并且列出NUM行。 ex:    $ grep -A 1 panda file 2&#xff1a;-B NUM     与 -A NUM 相对&#xff0c;显示除符合行之外&#xff0c;并显示在它之前的NUM行。         3&#xff1a;-C [NUM],     列出符合行之外并列出上下各NUM行&#xff0c;预设值是2。 可以直接写为 -n&#xff0c;如&#xff1a;grep -5 pattern filename同时显示匹配行的上下5行。4&#xff1a;-c, --count 不显示符合样式行&#xff0c;只显示符合的总行数。 若再加上-v&#xff0c;显示不符合的总行数。 5.   -f file 读取文件file&#xff0c;该文件的每一行都包含一个模式&#xff0c;从输入中查找匹配每个模式的行 6.   -r 文件夹 递归的搜索该文件夹中的目录&#xff0c;处理目录中的每个文件7.   -h, --no-filename    当搜索多个文件(-r 文件夹&#xff09;&#xff0c;在输出时不显示文件路径及名称。 注&#xff1a;不加-h&#xff0c;就是默认的时候&#xff0c;是显示文件名的&#xff0c;若是只是一个文件&#xff0c;则默认不显示&#xff08;一个的话你肯定指定了&#xff0c;你都知道了还显示什么呢&#xff1f;&#xff09;8.   -I (小写字母 l &#xff09; 只显示包含匹配的文件的文件名&#xff0c;且无论匹配多少次&#xff0c;只显示文件名一次。若是 -L&#xff0c;则是显示不匹配的文件名9.   -i, --ignore-case        忽略大小写                0.   -n, --line-number 在匹配的每行前&#xff0c;标上行号。 1.   -q, --quiet, --silent 不发送任何内容到标准输出&#xff0c;仅设置退出码。2.   -v, --invert-match 显示不匹配的行。 3.   -w, --word-regexp 完全匹配模式&#xff0c;完全匹配该"字"的行才会被列出。 4.   -x, --line-regexp     整行匹配&#xff0c;完全符合该"行"的行才会被列出

正则表达式&#xff1a;^ 匹配正则表达式的开始行 
$ 匹配正则表达式的结束行 
<从匹配正则表达式的行开始 
> 到匹配正则表达式的行结束 
[ ] 单个字符&#xff1b;如[A] 即A符合要求 
[ - ] 范围 &#xff1b;如[A-Z]即A&#xff0c;B&#xff0c;C一直到Z都符合要求 
. 所有的单个字符 
* 所有字符&#xff0c;长度可以为0

注意&#xff1a;有必要参考上文提到的各种工具之正则表达式语法比较 特别是grep和egrep还不太一样。实例&#xff1a;

$ ls -l | grep &#39;^a&#39;
通过管道过滤ls -l输出的内容&#xff0c;只显示以a开头的行。
$ grep &#39;test&#39; d*
显示所有以d开头的文件中包含test的行。
$ grep &#39;test&#39; aa bb cc
显示在aa&#xff0c;bb&#xff0c;cc文件中匹配test的行。
$ grep &#39;[a-z]\{5\}&#39; aa
显示所有包含每个字符串至少有5个连续小写字符的字符串的行。
$ grep &#39;w\(es\)t.*\1&#39; aa
如果west被匹配&#xff0c;则es就被存储到内存中&#xff0c;并标记为1&#xff0c;然后搜索任意个字符&#xff08;.*&#xff09;&#xff0c;这些字符后面紧跟着另外一个es&#xff08;\1&#xff09;&#xff0c;找到就显示该行。如果用egrep或grep -E&#xff0c;就不用"\"号进行转义&#xff0c;直接写成&#39;w(es)t.*\1&#39;就可以了。

[root&#64;bogon yum.repos.d]# find /etc/  -exec grep  -ln  &#39;alias ls&#39;  {} \;
/etc/profile.d/colorls.sh
/etc/profile.d/colorls.csh
/etc/lftp.conf
[root&#64;bogon yum.repos.d]# find /etc/  -exec grep  -n  &#39;alias ls&#39;  {} \;
20:     alias ls&#61;&#39;ls --color&#61;tty&#39; 2>/dev/null
30:alias ls &#39;ls --color&#61;tty&#39;

[root&#64;bogon yum.repos.d]# find /etc/  -exec grep  -nR  &#39;alias ls&#39;  {} \;
/etc/profile.d/colorls.sh:20:   alias ls&#61;&#39;ls --color&#61;tty&#39; 2>/dev/null
/etc/profile.d/colorls.csh:30:alias ls &#39;ls --color&#61;tty&#39;



推荐阅读
  • C++ 开发实战:实用技巧与经验分享
    C++ 开发实战:实用技巧与经验分享 ... [详细]
  • 在当前的软件开发领域,Lua 作为一种轻量级脚本语言,在 .NET 生态系统中的应用逐渐受到关注。本文探讨了 Lua 在 .NET 环境下的集成方法及其面临的挑战,包括性能优化、互操作性和生态支持等方面。尽管存在一定的技术障碍,但通过不断的学习和实践,开发者能够克服这些困难,拓展 Lua 在 .NET 中的应用场景。 ... [详细]
  • 性能测试中的关键监控指标与深入分析
    在软件性能测试中,关键监控指标的选取至关重要。主要目的包括:1. 评估系统的当前性能,确保其符合预期的性能标准;2. 发现软件性能瓶颈,定位潜在问题;3. 优化系统性能,提高用户体验。通过综合分析这些指标,可以全面了解系统的运行状态,为后续的性能改进提供科学依据。 ... [详细]
  • 本文探讨了如何通过编程手段在Linux系统中禁用硬件预取功能。基于Intel® Core™微架构的应用性能优化需求,文章详细介绍了相关配置方法和代码实现,旨在帮助开发人员有效控制硬件预取行为,提升应用程序的运行效率。 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • 基于Linux系统的Kickstart自动化服务器部署方案
    本文针对企业需求,提出了一种基于Linux系统的Kickstart自动化服务器部署方案。该方案旨在通过无盘批量安装操作系统,提高企业IT基础设施的部署效率。Kickstart是一种利用Anaconda工具实现服务器自动化安装的技术,能够显著简化和加速操作系统的安装过程。通过详细的实施规划,本文介绍了Kickstart的工作原理及其在实际部署中的应用,为企业提供了高效的自动化部署解决方案。 ... [详细]
  • 利用爬虫技术抓取数据,结合Fiddler与Postman在Chrome中的应用优化提交流程
    本文探讨了如何利用爬虫技术抓取目标网站的数据,并结合Fiddler和Postman工具在Chrome浏览器中的应用,优化数据提交流程。通过详细的抓包分析和模拟提交,有效提升了数据抓取的效率和准确性。此外,文章还介绍了如何使用这些工具进行调试和优化,为开发者提供了实用的操作指南。 ... [详细]
  • 在Ubuntu系统中安装Android SDK的详细步骤及解决“Failed to fetch URL https://dlssl.google.com/”错误的方法
    在Ubuntu 11.10 x64系统中安装Android SDK的详细步骤,包括配置环境变量和解决“Failed to fetch URL https://dlssl.google.com/”错误的方法。本文详细介绍了如何在该系统上顺利安装并配置Android SDK,确保开发环境的稳定性和高效性。此外,还提供了解决网络连接问题的实用技巧,帮助用户克服常见的安装障碍。 ... [详细]
  • 本文详细介绍了在Linux系统上编译安装MySQL 5.5源码的步骤。首先,通过Yum安装必要的依赖软件包,如GCC、GCC-C++等,确保编译环境的完备。接着,下载并解压MySQL 5.5的源码包,配置编译选项,进行编译和安装。最后,完成安装后,进行基本的配置和启动测试,确保MySQL服务正常运行。 ... [详细]
  • 在Java Web服务开发中,Apache CXF 和 Axis2 是两个广泛使用的框架。CXF 由于其与 Spring 框架的无缝集成能力,以及更简便的部署方式,成为了许多开发者的首选。本文将详细介绍如何使用 CXF 框架进行 Web 服务的开发,包括环境搭建、服务发布和客户端调用等关键步骤,为开发者提供一个全面的实践指南。 ... [详细]
  • 利用ZFS和Gluster实现分布式存储系统的高效迁移与应用
    本文探讨了在Ubuntu 18.04系统中利用ZFS和Gluster文件系统实现分布式存储系统的高效迁移与应用。通过详细的技术分析和实践案例,展示了这两种文件系统在数据迁移、高可用性和性能优化方面的优势,为分布式存储系统的部署和管理提供了宝贵的参考。 ... [详细]
  • 本文深入探讨了Java多线程环境下的同步机制及其应用,重点介绍了`synchronized`关键字的使用方法和原理。`synchronized`关键字主要用于确保多个线程在访问共享资源时的互斥性和原子性。通过具体示例,如在一个类中使用`synchronized`修饰方法,展示了如何实现线程安全的代码块。此外,文章还讨论了`ReentrantLock`等其他同步工具的优缺点,并提供了实际应用场景中的最佳实践。 ... [详细]
author-avatar
kcz1596369
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有