両方のコマンドをファイルと電子メール出力にリンクする

両方のコマンドをファイルと電子メール出力にリンクする
#!/bin/ksh


#HOSTS format:
HOSTS="xxxx.xxx.xxx.xx-ACCOUNT" 

FILE=/home/angela/list.txt #list will be saved on list.txt

date > $FILE
echo >> $FILE

for host in $HOSTS; do
  ip=$(echo $host|cut -d '-' -f 1)
  title=$(echo $host|cut -d '-' -f 2)
 lsuser -a login ALL | grep '=true$'  | awk '{ print $1 }'   >/tmp/delta 2>/dev/null

  echo "$title instance" >> $FILE
  perl -e 'print "=" x 65,"\n"' >>$FILE

#we filter through unwanteduser.list to remove unwanted users

  cat /tmp/delta|grep -wvf /home/angela/unwanteduser.list|sort >> $FILE
  echo >> $FILE
done

rm -f /tmp/delta


mailx -r [email protected] -s "List of active Users and Locked users" [email protected] <  "$FILE"

追加しようとしています。lsuser -a login ALL | grep '=false$' | awk '{ print $1 }'

ロックされたアカウントのリストを上記のスクリプトに送信し、アクティブなユーザーとロックされたユーザーのリストを含む電子メールを送信します。

現在のスクリプトは私にこれを提供します

Wed Oct 21 10:36:51 CDT 2015

Account instance
=================================================================
john
alex
raven
max

これを終えたい

Wed Oct 21 10:36:51 CDT 2015

list of Active users

Account instance
=================================================================

john
alex
raven
max

list of Locked users

Account instance
=================================================================
joe
tracy
karen
ben

これまでは、アクティブなユーザーだけを一覧表示できます。以下のスクリプトを試しましたが、出力なしで日付のみを取得しましたが、達成しようとしている形式には適していません。

 #!/bin/ksh



(
 date
 echo
 for host in $HOSTS; do
     echo "${host/*-} instance"cat
     perl -e 'print "=" x 65,"\n"'
 lsuser -a login ALL | awk '/=true$/ { print $1 }' | grep -wvf /home/angela/unwanted.list
lsuser -a login ALL | awk '/=false$/ { print $1 }' | grep -wvf /home/angela/unwanted.list
echo
 done
) | mailx -r [email protected] -s "List of active Users and Locked users" [email protected]

答え1

複数の異なるコマンドの出力をメッセージとして一緒にメールで送信するには、一時ファイルを使用せずにコマンドをグループ化してから、パイプのみを使用してください。

(
 date
 echo
 for host in $HOSTS; do
     echo "${host/*-} instance"
     perl -e 'print "=" x 65,"\n"
     lsuser -a login ALL | awk '/=true$/ { print $1 }' | grep -wvf /home/angela/unwanteduser.list
     echo
 done
) | mailx -r [email protected] -s "List of active Users and Locked users" [email protected]

(..thingは)別のサブシェルプロセスで角かっこ間のコマンドを実行するため、すべての標準出力を一緒にパイプできます。

フィルタリングは、データが生成されたときに実行されるのではなく、データが生成されたときに実行できます。

とにかくそれを使用する場合は、自分で処理する行を完全に選択できるため、パイプラインの対応する部分をawk省略できます。これは1つのプロセスを排除し、より効率的です。grepawk

また、一時的な「タイトル」変数を削除し、パターン置換を使用してIPアドレスを削除しました(*-何も変更しません)。

=Perlを呼び出すとかなりのオーバーヘッドが発生するので、65文字を綴ります。このスクリプトを実行するだけでは気付かないかもしれませんが、習慣として、時には毎秒数回実行されるようなスクリプトを書くと〜する違いを確認してください。

関連情報