将两个命令串联到文件和电子邮件输出

将两个命令串联到文件和电子邮件输出
#!/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]

(..东西)在单独的子 shell 进程中运行括号之间的命令,因此它的所有标准输出都可以通过管道连接在一起。

过滤可以在数据生成时完成,而不是在最后完成。

如果您awk无论如何都在使用,则可以省略grep管道的一部分,因为awk它完全能够选择要自行处理的行。这样就少了一个流程,效率更高。

我还取消了临时“标题”变量,使用模式替换来删除 IP 地址(*-不替换任何内容)。

我会拼出 65 个=字符,因为调用 Perl 来执行此操作会导致相当大的开销。您不会注意到仅运行此脚本,但如果您养成了习惯并且有时编写这样一个每秒执行多次的脚本,那么您将要注意差异。

相关内容