2

標準入力を介してスクリプトに入力している LDAP クエリがあります。特定の値、場合によっては複数の値を検索し、見つかった値を stdout 経由で送信したいと考えています。

私の LDAP クエリは次のようになります。

discover-repository-location=null, File Name=null, date-detected=Tue Jun11 12:44:14 UTC 2013, endpoint-machine-name=null, incident-id=545527, sender-ip=12.1.141.87, sender-email=WinNT://tmpdm/tmpcmp, Assigned To=null, sender-port=-null, endpoint-domain-name=null, Business Unit=null, endpoint-dos-volume-name=null, file-access-date=null, date-sent=Tue Jun 11 12:44:14 UTC 2013, endpoint-file-name=null, file-modified-by=null, Country=null, Manager Email=null, plugin-chain-id=1, discover-server=null, data-owner-name=null, Dismissal Reason=null, Last Name=null, First Name=null, Phone=null, subject=HTTP incident, Sender Email=null, UserID=null, endpoint-user-name=null, endpoint-volume-name=null, discover-name=null, discover-content-root-path=null, data-owner-email=null, file-create-date=null, endpoint-application-name=null, Employee Code=null, Region=null, Manager First Name=null, path=null, endpoint-application-path=null, Manager Last Name=null, Department=null, discover-location=null, protocol=HTTP, Resolution=null, file-owner=null, Postal Code=null, endpoint-file-path=null, Title=null, discover-extraction-date=null, Script-attribute=null, Manager Phone=null, file-created-by=null, file-owner-domain=nul

そして、このクエリからプロトコルまたは送信者の電子メール属性を引き出したいとします。これは 1 行として読み込まれます。次の方法で簡単に読み取ることができます。

while read stdin line; do
     echo $line
done

これらの属性が存在することを確認できるようになりましたが、キーと値のペアにある値を取得するのに問題があります。bashの正規表現でそうしようとしています。'=' と ',' を区切り文字として使用して完全な値を取得し、正規表現を使用して、属性から正しい値を取得したことを検証したいと考えています (安全チェックとログ記録の目的で)。 )。

どんな入力も役に立ち、非常に高く評価されます。

4

3 に答える 3

1

純粋な bash ソリューション:

data='discover-repository-location=null, File Name=null, date-detected=Tue Jun11 12:44:14 UTC 2013, endpoint-machine-name=null, incident-id=545527, sender-ip=12.1.141.87, sender-email=WinNT://tmpdm/tmpcmp, Assigned To=null, sender-port=-null, endpoint-domain-name=null, Business Unit=null, endpoint-dos-volume-name=null, file-access-date=null, date-sent=Tue Jun 11 12:44:14 UTC 2013, endpoint-file-name=null, file-modified-by=null, Country=null, Manager Email=null, plugin-chain-id=1, discover-server=null, data-owner-name=null, Dismissal Reason=null, Last Name=null, First Name=null, Phone=null, subject=HTTP incident, Sender Email=null, UserID=null, endpoint-user-name=null, endpoint-volume-name=null, discover-name=null, discover-content-root-path=null, data-owner-email=null, file-create-date=null, endpoint-application-name=null, Employee Code=null, Region=null, Manager First Name=null, path=null, endpoint-application-path=null, Manager Last Name=null, Department=null, discover-location=null, protocol=HTTP, Resolution=null, file-owner=null, Postal Code=null, endpoint-file-path=null, Title=null, discover-extraction-date=null, Script-attribute=null, Manager Phone=null, file-created-by=null, file-owner-domain=nul'

declare -A allValues

while read -s -d ',' line; do
    IFS='=' read key value <<< "${line}"
    allValues["$key"]=$value
done <<< "$data,"

echo "${allValues['protocol']}" # prints HTTP
echo "${allValues['sender-email']}" # prints WinNT://tmpdm/tmpcmp

このようにして、任意のフィールドを取得できます。もちろん、変数内に,または=文字があると、異常になります。

于 2013-09-04T18:32:47.763 に答える
0

awk を使用:

 protocol=$(awk -F'=' '$1=="protocol"{print $2}' RS='[, ]+' <<< "$STR" )
 sender_email=$(awk -F'=' '$1=="sender-email "{print $2}' RS='[, ]+' <<< "$STR")

Grep を使用:

 protocol=$(grep -oP '(?<=protocol=).*?(?=, )' <<< "$STR")
 sender_email=$(grep -oP '(?<=sender-email=).*?(?=, )' <<< "$STR")
于 2013-09-04T18:08:52.590 に答える