
以下を含む test_wd というファイルがあります。
dkde456:[email protected]
dkde123:[email protected]
dkde789:[email protected]
最初の列はユーザーID、2番目の列は完全なEメールアドレスです。私がdkde123だとしましょう。スクリプトを実行しましたが、結果は私のEメールアドレスにのみ送信されます。
私はこれを書いた:
LMUSER="`whoami`"
# So now I check whether my user-name is in the file:
if grep "${LMUSER}" test_wd
then echo "found"
# ??????? How to create a file and send this file to my email address
else
echo "not found"
exit 0
fi
スクリプトを実行してファイルを生成し、ファイルを自分のEメールアドレスに送信できるように列2を選択しようとしています。もしif条件文上記のコードで疑問符の代わりにtrueを返しますか?
答え1
これを行う方法はいくつかあります。これはgrep
+cut
バリエーションです...
# surround LMUSER with ^ and : to make sure we match whole usernames only
email=$(grep "^${LMUSER}:" test_wd | cut -d: -f2)
# $email will be empty unless there was a match
if [[ -n $email ]]; then
# send the message to "$email"
fi
それともあなたはそれが好きですかsed
?
email=$(sed -n "s/^${LMUSER}:\(.*\)/\1/p" test_wd)
-n
印刷用に明示的に指定された行を除くすべての行のp
印刷をスキップします(たとえば、ここで置換フラグを含む行)。 「代替が発生した場合は、この行を印刷してください」と表示されます。
電子メールアドレスのみを抽出するには、その部分を括弧で囲む必要があります\(
。\)
その後、交換時にこの括弧内のテキストを逆参照:\1
。
答え2
awkを使用して電子メールアドレスを抽出できます。
email=$(awk -F: -v usa=$(whoami) '$1 == usa { print $2 }' test_wd)
-Fを使用してフィールド区切り文字をに設定し、:
ユーザー名を変数として渡しますusa
。最初の:
区切りデータがユーザー名と同じ場合は、2番目のデータであるEメールアドレスを印刷します。
答え3
タイトルが「test」の「Hello user」というメッセージを送信するには、次のことを試してみてください(インストールして動作すると仮定mutt
)。
awk -F: '$1==user {print "Helo "$1 | "mutt -s 'test' " $2}' user=$USER test_wd