unix - grep用法 - 如何递归地grep?




unix grep用法 (16)

globbing **

使用grep -r作品,但它可能矫枉过正,尤其是在大文件夹中。

更实际的用法,下面是使用globbing语法** )的语法

grep "texthere" **/*.txt

这只会挑选具有模式选择模式的特定文件。 它适用于支持的shell,如Bash +4zsh

要激活此功能,请运行: shopt -s globstar

另请参阅: 如何在Linux上查找包含特定文本的所有文件?

git grep

对于Git版本控制下的项目,请使用:

git grep "pattern"

这要快得多。

ripgrep

对于较大的项目,最快的ripgrep工具是ripgrep ,它默认递归地扫描文件:

rg "pattern" .

它建立在Rust的正则表达式引擎之上,该引擎使用有限自动机,SIMD和积极的字面优化来快速搜索。 在这里查看详细分析

我如何递归地grep所有的目录和子目录?

find . | xargs grep "texthere" *

ag现在是我最喜欢的方式github.com/ggreer/the_silver_searcher 。 这与ack基本相同,但是还有一些优化。

这是一个简短的基准。 我在每次测试之前清除缓存(参见https://askubuntu.com/questions/155768/how-do-i-clean-or-disable-the-memory-cache

[email protected]$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
[email protected]$ time grep -r "hey ya" .

real    0m9.458s
user    0m0.368s
sys 0m3.788s
[email protected]:$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
[email protected]$ time ack-grep "hey ya" .

real    0m6.296s
user    0m0.716s
sys 0m1.056s
[email protected]$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
[email protected]$ time ag "hey ya" .

real    0m5.641s
user    0m0.356s
sys 0m3.444s
[email protected]$ time ag "hey ya" . #test without first clearing cache

real    0m0.154s
user    0m0.224s
sys 0m0.172s

下面是一个递归(bash和sh)函数,它遍历给定文件夹的所有子文件夹($ 1),并在给定文件($ 2)中使用grep搜索给定字符串($ 3):

$ cat script.sh
#!/bin/sh

cd "$1"

loop () {
    for i in *
    do
        if [ -d "$i" ]
        then
            # echo entering "$i"
            cd "$i"
            loop "$1" "$2"
        fi
    done

    if [ -f "$1" ]
    then
        grep -l "$2" "$PWD/$1"
    fi

    cd ..
}

loop "$2" "$3"

运行它和一个示例输出:

$ sh script start_folder filename search_string
/home/james/start_folder/dir2/filename

下面是在UnixLinux环境下递归搜索String的命令。

对于UNIX命令是:

find . -name "string to be searched" -exec grep "text" "{}" \;

对于Linux命令是:

grep -r "string to be searched" .

只是为了好玩,如果@christangrant的答案太多了,就不能输入:-)来快速查找* .txt文件

grep -r texthere .|grep .txt


只是文件名也是有用的

grep -r -l "foo" .

在POSIX系统中,对于grepgrep -rn "stuff" .找不到-r参数grep -rn "stuff" . 将不会运行,但如果您使用find命令,它将:

find . -type f -exec grep -n "stuff" {} \; -print

SolarisHP-UX同意。


在我的IBM AIX服务器(操作系统版本:AIX 5.2)中,使用:

find ./ -type f -print -exec grep -n -i "stringYouWannaFind" {} \; 

这将在文件中打印出路径/文件名和相对行号,例如:

./inc/xxxx_x.h

2865:/ **描述:stringYouWannaFind * /

无论如何,它适用于我:)


如果你知道你想要的文件的扩展名或模式,另一种方法是使用--include选项:

grep -r --include "*.txt" texthere .

您也可以提及使用--exclude排除的文件。

如果您经常搜索代码, github.com/ggreer/the_silver_searcher是grep更快的替代方案,它是为搜索代码而定制的。 例如,它默认是递归的,并自动忽略.gitignore列出的文件和目录,因此您不必为grep或find传递相同的繁琐排除选项。


如果您正在从目录结构中find所有文件中的特定内容,则可以使用find因为它更清楚您正在做什么:

find -type f -exec grep -l "texthere" {} +

请注意, -l (L的下划线)显示包含文本的文件的名称。 如果您不想打印比赛本身,请将其删除。 或者使用-H将文件与匹配一起获取。 总而言之,其他选择是:

find -type f -exec grep -Hn "texthere" {} +

其中-n打印行号。


我现在总是使用(即使在Windows上使用GoW - Windows上的Gnu ):

grep --include="*.xxx" -nRHI "my Text to grep" *

这包括以下选项:

--include=PATTERN

在目录中只搜索匹配PATTERN文件。

-n, --line-number

在每个输出行的前面加上输入文件中的行号。

-R, -r, --recursive

递归读取每个目录下的所有文件; 这相当于-d recurse选项。

-H, --with-filename

打印每场比赛的文件名。

-I     

处理二进制文件,就好像它不包含匹配数据一样;
这相当于--binary-files=without-match选项。

如果我想要区分大小写的结果,我可以添加' i '(- -nRHIi )。

我可以得到:

/home/vonc/gitpoc/passenger/gitlist/github #grep --include="*.php" -nRHI "hidden" *
src/GitList/Application.php:43:            'git.hidden'      => $config->get('git', 'hidden') ? $config->get('git', 'hidden') : array(),
src/GitList/Provider/GitServiceProvider.php:21:            $options['hidden'] = $app['git.hidden'];
tests/InterfaceTest.php:32:        $options['hidden'] = array(self::$tmpdir . '/hiddenrepo');
vendor/klaussilveira/gitter/lib/Gitter/Client.php:20:    protected $hidden;
vendor/klaussilveira/gitter/lib/Gitter/Client.php:170:     * Get hidden repository list
vendor/klaussilveira/gitter/lib/Gitter/Client.php:176:        return $this->hidden;
...

或者安装ack,如果你想要一个更快的方法,并且做了很多。


要查找包含特定string递归pathfiles名称,请使用UNIX下的UNIX命令:

find . | xargs grep "searched-string"

对于Linux

grep -r "searched-string" .

UNIX服务器上找到一个文件

find . -type f -name file_name

在LINUX服务器上找到一个文件

find . -name file_name

请注意, find . -type f | xargs grep whatever find . -type f | xargs grep whatever find . -type f | xargs grep whatever当find中有太多的文件匹配时, find . -type f | xargs grep whatever哪种解决方案都会遇到“参数列表变长”错误。

最好的选择是grep -r但如果不可用,请使用find . -type f -exec grep -H whatever {} \; find . -type f -exec grep -H whatever {} \; 代替。


这是我的当前机器上工作的一个(在Windows 7上git bash):

find ./ -type f -iname "*.cs" -print0 | xargs -0 grep "content pattern"

我总是忘记带有空格的路径的-print0和-0。

编辑:我现在首选的工具是ripgrep: https://github.com/BurntSushi/ripgrep/releaseshttps://github.com/BurntSushi/ripgrep/releases 。 它非常快速,并具有更好的默认值(如默认递归)。 与我的原始答案相同,但使用ripgrep: rg -g "*.cs" "content pattern"


The syntax is:
cd /path/to/dir
grep -r <"serch_word name"> .




grep