Discussion:
[shell-script] Comportamento estranho do array no for
Marlon Reck marlon_mca@yahoo.com.br [shell-script]
2018-02-01 16:35:03 UTC
Permalink
Boa tarde Mestres
Estou fazendo uma linha de comando para comparar o usuário de login do ftp com o diretório do usuário cadastrado, para isso estou analisando os arquivos "messages" e "password". Só que me deparei com um comportamento que não consegui compreender e peço para entender o que esta ocorrendo. O caso é  é que um dos resultados acaba sendo duplicado no fim do comando.Abaixo esta a síntese que vou tentar explicar e também no pastebin, tem o exemplo do arquivo messages, outros comandos que tentei  e o exemplo com o comando "echo".
log messagehttps://pastebin.com/raw/ziXy55Xk 
resultado repetidohttps://pastebin.com/raw/Tnt5PFGB
resultado sem repetiçãohttps://pastebin.com/raw/W9D7dW3K
Comando completo:
for i in $(grep "OK LOGIN" messages |awk 'gsub (/[\[\]]/,"",$13) {print $13}'|sort -u);do awk -F: /"$i"/'{print $1"==="$6}' /etc/passwd ;done

1=Primeiro pego o usuário que logou com o "grep", depois limpo a sujeira com o "awk" e deixo um registro apenas com o "sort":grep "OK LOGIN" messages |awk 'gsub (/[\[\]]/,"",$13) {print $13}'|sort -u
2=Segundo transformo o resultado num array pra usar no loop "for":for i in $(grep "OK LOGIN" messages |awk 'gsub (/[\[\]]/,"",$13) {print $13}'|sort -u);do
3=Terceiro com o loop do for faço a comparação de cada item do array com o arquivo "passwd": awk -F: /"$i"/'{print $1"==="$6}' /etc/passwd ;done

É nesse ponto que acontece a repetição do resultado que não consegui entender.
Se trocar essa parte do código por um "grep" (grep $i ) também tenho o resultado duplicado, isso só não acontece quando uso o "echo" ( echo $i ).
4=O resultado:
dba<==>/srv/ftp/dbadvgp<==>/srv/ftp/dvgpdvgp_visita<==>/srv/ftp/dvgpgpsveicular<==>/srv/ftp/dvgp/atualiza-gps-veicular/dvod<==>/srv/ftp/dvodgpsveicular<==>/srv/ftp/dvgp/atualiza-gps-veicular/



Desde já agradeço e obrigado.Atenciosamente
Marlon V. Reck
***@yahoo.com.br
'Julio C. Neves' julio.neves@gmail.com [shell-script]
2018-02-01 19:00:12 UTC
Permalink
Não me debrucei muito tempo no teu problema, mas me parece que o problema
está no sort -u, pq me parece que o que vc deseja é excluir usuários
duplicados e vc está excluindo registros duplicado, que creio não haver.

Acho que vc quer algo mais ou menos assim:

Usus=$(sed -r '/OK LOGIN/ !d; s/.*\[(.*)\].*/^\1:/' messages | sort -u)
grep -f <(echo "$Usus") /etc/passwd | cut -f6 -d:

Não testei nem nada, mas vê se é isso. Se for assim e vc não entender,
pergunte que explico melhor (até pq não expliquei nada) ;)

Abraços,
Julio

*» Não tem tempo para fazer um curso presencial?*
*» Na sua cidade não tem nenhum bom curso de Linux?*
*» O treinamento está muito caro?*

*Ministramos um excelente treinamento de Shell,*
*no **formato EAD. **Veja os detalhes aqui.*
<http://www.dicas-l.com.br/programacao-shell-linux/>

*Damos treinamento em sua empresa **com certificado*
*e nota fiscal **por **um preço, **no mínimo, 50% **abaixo*
*de qualquer curso.*

​​
Nosso time de instrutores *in company* é formado somente por
​
​
autores
​ ​
​
de
*Best Sellers​ ​*​laureados ​sobre os temas.. P. exemplo:

Shell básico e Programação em Shell Julio Neves
Bacula Heitor Medrado
Zabbix Adail Host
Produção Gráfica e Videografismo Cadunico
Post by Marlon Reck ***@yahoo.com.br [shell-script]
Boa tarde Mestres
Estou fazendo uma linha de comando para comparar o usuário de login do ftp
com o diretório do usuário cadastrado, para isso estou analisando os
arquivos "messages" e "password". Só que me deparei com um comportamento
que não consegui compreender e peço para entender o que esta ocorrendo.
O caso é é que um dos resultados acaba sendo duplicado no fim do comando.
Abaixo esta a síntese que vou tentar explicar e também no pastebin, tem o
exemplo do arquivo messages, outros comandos que tentei e o exemplo com o
comando "echo".
log message
https://pastebin.com/raw/ziXy55Xk
resultado repetido
https://pastebin.com/raw/Tnt5PFGB
resultado sem repetição
https://pastebin.com/raw/W9D7dW3K
for i in $(grep "OK LOGIN" messages |awk 'gsub (/[\[\]]/,"",$13) {print
$13}'|sort -u);do awk -F: /"$i"/'{print $1"==="$6}' /etc/passwd ;done
1=Primeiro pego o usuário que logou com o "grep", depois limpo a sujeira
grep "OK LOGIN" messages |awk 'gsub (/[\[\]]/,"",$13) {print $13}'|sort -u
for i in $(grep "OK LOGIN" messages |awk 'gsub (/[\[\]]/,"",$13) {print
$13}'|sort -u);do
3=Terceiro com o loop do for faço a comparação de cada item do array com o
awk -F: /"$i"/'{print $1"==="$6}' /etc/passwd ;done
É nesse ponto que acontece a repetição do resultado que não consegui entender.
Se trocar essa parte do código por um "grep" (grep $i ) também tenho o
resultado duplicado, isso só não acontece quando uso o "echo" ( echo $i ).
dba<==>/srv/ftp/dba
dvgp<==>/srv/ftp/dvgp
dvgp_visita<==>/srv/ftp/dvgp
gpsveicular<==>/srv/ftp/dvgp/atualiza-gps-veicular/
dvod<==>/srv/ftp/dvod
gpsveicular<==>/srv/ftp/dvgp/atualiza-gps-veicular/
Desde já agradeço e obrigado.
Atenciosamente
Marlon V. Reck
Loading...