私は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