Catenation de dois comandos para um arquivo e saída de email

1
#!/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"

Estou tentando adicionar lsuser -a login ALL | grep '=false$' | awk '{ print $1 }'

lista de conta bloqueada para o script acima e enviar e-mail com lista de usuários ativos e usuários bloqueados

Apresentar script me dá isso

Wed Oct 21 10:36:51 CDT 2015

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

Eu quero fazer isso

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

Até agora eu consegui listar apenas usuários ativos. Eu tentei abaixo script só tenho a data sem qualquer saída, no entanto, não atende o formato im tentando realizar

 #!/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]
    
por Angela 21.10.2015 / 19:07

1 resposta

0

Se você quiser enviar a saída de vários comandos diferentes juntos em uma mensagem, não se preocupe com arquivos temporários, agrupe os comandos e simplesmente use um canal:

(
 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]

A coisa ( .. ) executa o comando entre os colchetes em um processo de subshell separado, então toda a sua saída padrão pode ser canalizada.

A filtragem pode ser feita no ponto em que os dados estão sendo gerados, em vez de no final.

Se você estiver usando awk , você pode deixar de fora a parte grep do pipeline, pois awk é perfeitamente capaz de selecionar quais linhas processar. Isso requer um processo a menos que seja mais eficiente.

Eu também acabei com a variável temp "title", usando a substituição patterm para me livrar do endereço IP (substitui *- por nada).

Eu soletrei 65% dos caracteres=, já que chamar o perl para isso leva a uma sobrecarga substancial. Você não notará muito a execução apenas deste script, mas se você adquirir o hábito e algum tempo escrever um script desse tipo que seja executado várias vezes por segundo, então irá notar a diferença.

    
por 22.10.2015 / 14:40