shell脚本中的grep实用程序

时间:2009-10-09 14:33:50

标签: shell grep

我正在努力克服对文件结构的限制。我想在已知位置grep一系列文件。如果我从命令行执行标准grep

(grep -i searchpattern known_dir/s*.sql) 

我收到以下错误:

ksh: /usr/bin/grep: 0403-027 The parameter list is too long.

所以我有一个小循环看起来像:

searchfor=$1
for i in /$ENV_VAR_DIR/s*.sql
do
  grep -i $searchfor $i
done

当我执行此操作时,我遇到了几个问题:

  1. 它给了我一行代码,但没有我需要的文件名
  2. -l显然只给了我想要修剪路径的路径/文件名,我只是从我的主目录执行。

7 个答案:

答案 0 :(得分:3)

我会推荐以下内容:

$ find known_dir -name 's*.sql' -print0 | xargs -0 grep -i searchpattern

使用xargs,您可以使用grep选项更改传递到-n的最大文件数。

-print0-0选项可以防御文件名中的空格。

您甚至可以使用grep选项在多个核心上并行计算多个-P命令。

答案 1 :(得分:2)

作为一个hack,您还可以为grep命令指定/ dev / null以使-l列出文件,但是由于它使用shell循环并且每个文件启动一个grep进程,因此您的方法会很慢。如上所述,findxargs是您的朋友。

也许您可以使用findrepo脚本,它似乎可以根据您的需要进行操作。

答案 2 :(得分:1)

ls | read fname; do
    grep searchpattern $fname /dev/null
done

这对你有两件事。

  1. 您不需要一次扩展所有文件,而是一次处理一个文件。
  2. 通过将/ dev / null列为第二个文件,它将不会匹配任何内容,但它将获得grep来打印文件名。 Gnu grep有一个强制文件名输出的选项,但这适用于任何unix。
  3. 使用此shell设计模式的另一个传统方法是使用find提供循环。

    find . -name "*.sql" | read fname; do
        grep searchpattern $fname /dev/null
    done
    

    您可能还希望将searchpattern设为$1

答案 3 :(得分:1)

find ./known_dir/ -name“s * .sql”| xargs grep -i searchpattern

答案 4 :(得分:0)

grep -H将强制将文件名添加到每个输出行,就像您执行原始单个命令时一样。

-H-l获取文件名的最简单方法是在运行命令时将目录作为当前工作目录:

searchfor=$1
cd /$ENV_VAR_DIR
for i in s*.sql
do
  grep -Hi $searchfor $i
done

答案 5 :(得分:0)

您需要ackgrin

答案 6 :(得分:0)

easy_install grin    
grin -I "*.sql" searchpattern

仅显示文件名

grin -I "*.sql" -l searchpattern