4

我正在努力传递变量中包含的几个 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 有关,但我不确定。

4

3 回答 3

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"
于 2013-01-19T12:36:44.857 回答
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——除非,我想,您有一些别名grep(这就是问题所在;不要使用别名grep)。

于 2013-01-19T18:37:57.343 回答
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
于 2013-01-19T13:00:40.670 回答