使用变量在bash中传递grep模式

时间:2013-01-19 12:22:55

标签: arrays bash design-patterns grep ifs

我正在努力传递变量中包含的几个grep模式。这是我的代码:

#!/bin/bash
GREP="$(which grep)"
GREP_MY_OPTIONS="-c"
for i in {-2..2}
do
  GREP_MY_OPTIONS+=" -e "$(date --date="$i day" +'%Y-%m-%d')
done
echo $GREP_MY_OPTIONS

IFS=$'\n'
MYARRAY=( $(${GREP} ${GREP_MY_OPTIONS} "/home/user/this path has spaces in it/"*"/abc.xyz" | ${GREP} -v :0$ ) )

这就是我想要的:

  • 确定/定义grep的位置
  • 分配一个变量(GREP_MY_OPTIONS)保存参数,我将传递给grep
  • 将多个模式分配给GREP_MY_OPTIONS
  • 使用grep和我在$ GREP_MY_OPTIONS中存储的模式搜索包含空格的路径中的几个文件并将它们保存在数组中

当我使用“echo $ GREP_MY_OPTIONS”时,它会产生我的预期,但是当我运行脚本时它失败并出现以下错误:

/ bin / grep:无效选项 - ''

我做错了什么?如果路径中没有空格,一切似乎都能正常工作,所以我认为这与IFS有关,但我不确定。

3 个答案:

答案 0 :(得分:3)

如果您想要grep一组路径中的某些内容,您可以执行以下操作:

find <directory> -type f -print0 |
    grep "/home/user/this path has spaces in it/\"*\"/abc.xyz" |
    xargs -I {} grep <your_options> -f <patterns> {}

因此<patterns>是一个文件,其中包含您要在directory的每个文件中搜索的模式。

考虑到你的答案,这应该做你想要的:

find "/path\ with\ spaces/" -type f | xargs -I {} grep -H -c -e 2013-01-17 {}

来自man grep

   -H, --with-filename
          Print  the  file  name for each match.  This is the default when
          there is more than one file to search.

由于您要将元素插入到数组中,因此可以执行以下操作:

IFS=$'\n'; array=( $(find "/path\ with\ spaces/" -type f -print0 |
    xargs -I {} grep -H -c -e 2013-01-17 "{}") )

然后将值用作:

echo ${array[0]}
echo ${array[1]}
echo ${array[...]}

使用变量传递参数时,使用eval来评估整行。执行以下操作:

parameters="-H -c"
eval "grep ${parameters} file"

答案 1 :(得分:1)

如果您将GREP_MY_OPTIONS构建为数组而不是简单字符串,则可以使原始大纲脚本合理地工作:

#!/bin/bash
path="/home/user/this path has spaces in it"
GREP="$(which grep)"
GREP_MY_OPTIONS=("-c")
j=1
for i in {-2..2}
do
    GREP_MY_OPTIONS[$((j++))]="-e"
    GREP_MY_OPTIONS[$((j++))]=$(date --date="$i day" +'%Y-%m-%d')
done

IFS=$'\n'
MYARRAY=( $(${GREP} "${GREP_MY_OPTIONS[@]}" "$path/"*"/abc.xyz" | ${GREP} -v :0$ ) )

我不清楚为什么你使用GREP="$(which grep)",因为你将执行相同的grep,就像你直接写grep一样 - 除非,我想,你有{{1}的别名1}}(这就是问题;不要别名grep)。

答案 2 :(得分:0)

你可以做一件事而不会让事情变得复杂:

首先在脚本中执行更改目录,如下所示:

cd /home/user/this\ path\ has\ spaces\ in\ it/
$ pwd
/home/user/this path has spaces in it

$ cd "/home/user/this path has spaces in it/"
$ pwd
/home/user/this path has spaces in it

然后在你的剧本中做你想做的事。

$(${GREP} ${GREP_MY_OPTIONS} */abc.xyz)

编辑

[sgeorge@sgeorge-ld stack1]$ ls -l
total 4
drwxr-xr-x 2 sgeorge eng 4096 Jan 19 06:05 test tesd
[sgeorge@sgeorge-ld stack1]$ cat test\ tesd/file 
SUKU
[sgeorge@sgeorge-ld stack1]$ grep SUKU */file
SUKU

编辑

[sgeorge@sgeorge-ld stack1]$ find */* -print | xargs -I {} grep SUKU {}
SUKU