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に渡すパラメータを保持する変数(GREP_MY_OPTIONS)を割り当てます
  • 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)"と同じように実行するため、なぜ使用するのかは明確ではありません—ただし、何らかのエイリアスがある場合を除きます(これが問題です。エイリアスを使用しないでください)。grepgrepgrepgrep

于 2013-01-19T18:37:57.343 に答える
0

物事を複雑にすることなく、1 つのことを行うことができます。

最初に、次のようにスクリプトでディレクトリを変更します。

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 に答える