当前位置: 首页>>技术教程>>正文


如何使用“grep”命令查找包括子目录的文本

, ,

问题描述

我想查找包含特定字符串文本的所有文件。 grep命令的作品,但我不知道如何使用它的每个目录(我只能做我的当前目录)。我尝试阅读man grep,但没有得到任何帮助。

最佳解决办法

使用会更好

grep -rl "string" /path

哪里

  • -r(或--recursive)选项用于遍历/path的所有sub-directories,而

  • -l(或--files-with-matches)选项仅用于打印匹配文件的文件名,而不用于匹配行(这也可以提高速度,因为grep在与此选项首次匹配时停止读取文件)。

次佳解决办法

如果您正在寻找匹配文件的行,我最喜欢的命令是:

grep -Hrn 'search term' path/to/files
  • -H导致打印文件名(在搜索多个文件时隐含)

  • -r执行递归搜索

  • -n导致行号被打印

path/to/files可以是.在当前目录中搜索

我发现其他选项非常有用:

  • -I忽略二进制文件(补充:-a将所有文件视为文本)

  • -Fsearch term视为文字,而不是正则表达式

  • -i执行大小写敏感搜索

  • --color=always强制颜色,即使通过less管道。要制作less支持颜色,您需要使用-r选项:

    grep -Hrn search . | less -r
    
  • --exclude-dir=dir用于排除像.svn.git这样的目录。

command-line,grep,ubuntu

第三种解决办法

我相信你可以使用这样的东西:

find /path -type f -exec grep -l "string" {} \;

来自评论的解释

find是一个命令,可让您在给定路径的子目录中查找文件和其他对象,如目录和链接。如果您未指定文件名应符合的掩码,则枚举所有目录对象。

  • -type f指定它应该只处理文件,而不是目录等。

  • -exec grep指定对于每个找到的文件,它应该运行grep命令,将它的文件名作为参数传递给它,通过用文件名替换{}

第四种办法

我的默认命令是

grep -Rin string *

我使用国会大厦’R’,因为ls使用它来递归。既然grep同时接受,没有理由不使用它。

编辑:每HVNSweeting,显然-R将遵循符号链接,因为-r不会。

第五种办法

如果你愿意尝试新的东西,给ack一个镜头。递归搜索string当前目录的命令是:

ack string

安装非常简单:

curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 !#:3

(只要你已经有目录~/bin,并且最好在你的PATH中。)

第六种办法

命令rgrep专门用于这种需要

如果不可用,你可以像这样得到它

mkdir -p ~/bin
cd ~/bin
wget http://sdjf.esmartdesign.com/files/rgrep
chmod +x rgrep

如上所述,您可以直接设置为默认的grep选项。

我个人使用

[[  ${#args} -lt 5 && "${args//[[:space:]]/}" == "-i" ]] && args="-Hin"
args="${args:--Hns} --color=auto"

相关主题:how to always use rgrep with color

第七种办法

更新2:

这条命令使用findgrep修复了这个问题:

$ find path_to_search_in -type f -exec grep -in searchString {} 2> /dev/null +

--color=<always or auto>彩色输出:

$ find path_to_search_in -type f \
            -exec grep --color=always -in searchString {} 2>/dev/null +

例:

$ find /tmp/test/ -type f -exec grep --color=auto -in "Search string" {} 2>/dev/null +

下面的快照中运行一个示例:

command-line,grep,ubuntu


更新1:

你可以尝试下面的代码;作为.bashrc.bash_aliases或脚本中的一项功能:

wherein ()  {      for i in $(find "$1" -type f 2> /dev/null);     do         if grep --color=auto -i "$2" "$i" 2> /dev/null; then             echo -e "\033[0;32mFound in: $i \033[0m\n";         fi;     done } 

用法:wherein /path/to/search/in/ searchkeyword

例:

$ wherein ~/Documents/ "hello world"

(注意:如@enzotib在下面的评论中所建议的,这不适用于文件/目录,包括名称中的空格。)


原帖

搜索字符串并用搜索字符串输出该行:

$ for i in $(find /path/of/target/directory -type f); do \
    grep -i "the string to look for" "$i"; done

例如。:

$ for i in $(find /usr/share/applications -type f); \
    do grep -i "web browser" "$i"; done

要显示包含搜索字符串的文件名:

$ for i in $(find /path/of/target/directory -type f); do \
    if grep -i "the string to look for" "$i" > /dev/null; then echo "$i"; fi; done;

例如。:

$ for i in $(find /usr/share/applications -type f); \
    do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \
    fi; done;

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/118.html,未经允许,请勿转载。