grepフィルタでスクリプトが返した値をどのように使用しますか?

grepフィルタでスクリプトが返した値をどのように使用しますか?

私はFreeBSDのcshを使用しています。ユーザーのドメインで行を構成し、その行を使用して exim メールログをフィルタリングして、そのユーザーのドメインとのみメッセージを送受信したいと思います。

DirectAdminドメインリストから行を構成するスクリプトを作成しました。

#!/bin/sh
user="some-user"

    list=$(cat /usr/local/directadmin/data/users/$user/domains.list)
    domaincount=$(echo $list|wc -w)
    echo $list| tr ' ' '|'

'domain.com'このスクリプトを実行すると、次のフィールドを含む行が返されます。'domain1.com|domain2.net'

grep今ではパラメータとして使用したいのですが、

cat /var/log/exim/mainlog |egrep `/path/to/rowscript`

何も返しませんが、手動で結果を変更すると、/path/to/rowscript私が見たい結果が返されます。

試してみてください

grep -E "`/path/to/rowscript`", 
egrep '`/path/to/rowscript`' 
egrep `/bin/sh /path/to/rowscript`
egrep $(/path/to/rowscript)
    getting "Illegal variable name."

待っていましたが、まだ運がありません。

ところで、dateバックティックはうまく動作します。

cat /var/log/exim/mainlog | grep `date +%Y-%m-%d`

私は何が間違っていましたか?

ベストアンサー1

スクリプトは一重引用符を出力しないでください。書くとき

egrep 'foo|bar'

一重引用符はシェル構文の一部です。彼らはその中にいるキャラクターを拡張から保護します。スクリプト出力に一重引用符が表示されると、通常の文字として扱われます。ただ省略してください。

スクリプトを書くより簡単な方法があります。改行をパイプ記号に置き換え、最後の記号を削除することです。

list=$(</usr/local/directadmin/data/users/$user/domains.list tr '\n' '|')
echo "${list%|}"

固定文字列セットを探している場合は、これを行う必要はありません。代わりに-F、オプションを使用してgrep固定文字列を検索するように指示し、オプションを-f使用してファイルからパターンのリストを読み取るように指示します。

grep -Ff /usr/local/directadmin/data/users/bob/domains.list

domain.comファイル内にファイルを含めると、検索時に長い文字列の一致も返されます。otherdomain.comしたがって、スクリプトを使用して開始と終了にアンカーを含むパターンを作成することで、偽の一致を回避できます。たとえば、名前の周りにスペースがある場合は、eximログにどのような句読点があるのか​​わかりません。

#!/bin/sh
list=$(</usr/local/directadmin/data/users/$1/domains.list tr '\n' '|')
echo " (${list%|}) "

そして電話してください

</var/log/exim/mainlog grep -E `/path/to/rowscript bob`

または、スクリプト呼び出し grep を実行します。

#!/bin/sh
shift
list=$(</usr/local/directadmin/data/users/$1/domains.list tr '\n' '|')
grep -E " (${list%|}) " -- "$@"

~と呼ばれる

</var/log/exim/mainlog /path/to/rowscript bob

おすすめ記事