Listar 'palavras' de um arquivo, com excessões de outro arquivo

1. Listar 'palavras' de um arquivo, com excessões de outro arquivo

Daniel P. L. Almeida
daniel.uramg

(usa Outra)

Enviado em 15/09/2010 - 17:44h

Pessoal estou com o segunte problema. quero listar todos os IPs da tabela ARP com excessão dos que estão cadastrados em um arquivo.
cat /proc/net/arp | cut -f 1 -d" " #Listo somente os IPs da tabela ARP

cat /usr/local/easycaptive/config/passwd | cut -f 3 -d: #Listo os IPs que não quero exibir

Então tentei assim:
cat /proc/net/arp | cut -f 1 -d" " | grep -v `cat /usr/local/easycaptive/config/passwd | cut -f 3 -d:`

Me retornou "grep no suck file or directory ..." de todos os IPs desta lista.. se eu colocar somente um IP no lugar do `cat /usr/local/easycaptive/config/passwd | cut -f 3 -d:` ai da certo, ele mostra todos os IPs da tabela ARP menos aquiele que eu especifiquei

Assim não funciona mesmo? Qual o modo mais simples de eu fazer isso?

Obrigado


  


2. MELHOR RESPOSTA

Vinicius Mello
vmmello

(usa Slackware)

Enviado em 17/09/2010 - 14:27h

O problema no script do primeiro post está após o segundo pipe, que está gerando uma string com espaços, e o grep está interpretando como se fosse um arquivo de entrada. Colocando a execução entre aspas "``" corrigiria apenas parte do problema.

Sugestão: cria um arquivo temporario com os IPs que tem que ser excluídos e ao ler cada IP da tabela ARP dá um grep no arquivo pra ver se existe o IP (se existe não lista).

Em código:

TMP_IPS_EXCL=$(mktemp) # criado um arquivo temporario

# salvando os IPs que existem no passwd no arquivo temporario
cat /usr/local/easycaptive/config/passwd | cut -f 3 -d: > $TMP_IPS_EXCL

while read LINHA; do
IP_V=$(echo $LINHA | cut -f 1 -d" ")
if grep -q "$IP_V" $TMP_IPS_EXCL; then
# o IP existe no passwd: ignorando...
continue
else
# o IP nao existe no passwd: mostrando
echo $IP_V
fi
done < /proc/net/arp


3. Consegui

Daniel P. L. Almeida
daniel.uramg

(usa Outra)

Enviado em 15/09/2010 - 20:39h

EDIT: Na verdade não deu certo não, eu que viajei, eu preciso que o script faça isso que ele esta fazendo, listar os IPs da tabela ARP so que não listar os que estãó na "%ipspasswd"

CLEOF
ipspasswd=`cat $PASSWDFILE | cut -f 3 -d:`
ipsarp=`cat /proc/net/arp | grep $IF_LOCAL | cut -f 1 -d" " | grep -v IP`
echo $ipsarp | while read USER_IP; do
USER_NAME=`cat /var/state/dhcp/dhcpd.leases | grep $USER_IP | tr -s ' ' | cut -d " " -f 4`
USER_MAC=`grep $USER_IP /proc/net/arp | tr -s ' ' | cut -d " " -f 4`
cat << CLEOF
<tr>
<td class="row2 style7"><div align="center">$USER_NAME</div></td>
<td class="row2 style7"><div align="center">$USER_IP</div></td>
<td class="row2 style7"><div align="center">$USER_MAC</div></td>
<td class="row2 style7"><div align="center"><a href="?action=authadduser">Adicionar</a></div></td>
</tr>
CLEOF
done
cat << CLEOF

Esta listando todos os IPs com MAC e Hostname do geito que eu quero, so não consegui fazer ele não mostrar quem estiver na "$ipspasswd"


4. Re: Listar 'palavras' de um arquivo, com excessões de outro arquivo

Daniel P. L. Almeida
daniel.uramg

(usa Outra)

Enviado em 17/09/2010 - 15:19h

vmmelo quase deu certo, TMP_IPS_EXCL=$(mktemp) aqui não internpretou, deve ser porque o interpretador shell do BFW é o sh, mas nisso fiz uma pequena alteração:
#!/bin/sh
TMP_IPS_EXCL="/teste"
# salvando os IPs que existem no passwd no arquivo temporario
cat /usr/local/easycaptive/config/passwd | cut -f 3 -d: > $TMP_IPS_EXCL
while read LINHA; do
IP_V=$(echo $LINHA | cut -f 1 -d" ")
if grep -q "$IP_V" $TMP_IPS_EXCL; then
# o IP existe no passwd: ignorando...
continue
else
# o IP nao existe no passwd: mostrando
echo $IP_V
fi
done < /proc/net/arp

Assim o script me retorna os IPs que não estão no passwd, porem ele tinha que filtrar tambem somente os IPs que estão na $IF_LOCAL (grep $IF_LOCAL), e tambem não mostrtar "IP" (grep -v IP), tentei colocar esses GREP na frente do < /proc/net/arp mas nao obitve exito

o negocio vai rodar dentro de um CGI que ja tenho, esse segundo script ai que postei que é a parte da função. nesse esquema aqui vou precisar fazer um script separado e o CGI chamar ele na função while read, ou tem como eu jogar os valores finais pra uma variavel, pra ficar tudo dentro do CGI?

Obrigado pela ajuda!


5. Re: Listar 'palavras' de um arquivo, com excessões de outro arquivo

Vinicius Mello
vmmello

(usa Slackware)

Enviado em 17/09/2010 - 15:56h

Daniel,

Sobre a parte TMP_IPS_EXCL=$(mktemp) talvez nessa distribuição não tenha o mktemp instalado.


E sobre rodar dentro ou fora do CGI, é uma questão de escolha. Se o CGI for uma linguagem interpretada, deve ser fácil escrever isso na própria linguagem do CGI, ao invés de escrever um shell script externo.


6. Re: Listar 'palavras' de um arquivo, com excessões de outro arquivo

Daniel P. L. Almeida
daniel.uramg

(usa Outra)

Enviado em 17/09/2010 - 16:07h

E pra eu filtrar tambem somente os IPs da $IF_LOCAL e não mostrar "IP" como eu faço?


7. Re: Listar 'palavras' de um arquivo, com excessões de outro arquivo

Daniel P. L. Almeida
daniel.uramg

(usa Outra)

Enviado em 17/09/2010 - 18:45h

vmmello consegui filtrar o $IF_LOCAL e IP, so faltava pensar um pouco.
Eu joguei esses IPs pra um novo arquivo temporario (/teste), pois assim ficou tudo no proprio CGI, ai a função while read ja existente so troquei a variavel, ficou excelente muito obrigado pela ajuda!

#!/bin/sh
TMP_IPS_EXCL="/ipstemp"
# salvando os IPs que existem no passwd no arquivo temporario
cat /usr/local/easycaptive/config/passwd | cut -f 3 -d: > $TMP_IPS_EXCL
while read LINHA; do
IP_V=$(echo $LINHA | grep $IF_LOCAL | grep -v IP | cut -f 1 -d" ")
if grep -q "$IP_V" $TMP_IPS_EXCL; then
# o IP existe no passwd: ignorando...
continue
else
# o IP nao existe no passwd: mostrando
echo $IP_V
fi
done < /proc/net/arp >/teste


8. Re: Listar 'palavras' de um arquivo, com excessões de outro arquivo

Vinicius Mello
vmmello

(usa Slackware)

Enviado em 17/09/2010 - 19:49h

Legal Daniel.


9. Re: Listar 'palavras' de um arquivo, com excessões de outro arquivo

Daniel P. L. Almeida
daniel.uramg

(usa Outra)

Enviado em 17/09/2010 - 21:51h

Consegui incluir isto naquela mesma função while read que eu ja tinha feito, assim reduziu em varias linhas e nao precisei jogar pra um arquivo e depois ler dele

cat /usr/local/easycaptive/config/passwd | cut -f 3 -d: > $IPSECTEMP
cat /proc/net/arp | cut -f 1 -d" " | while read USER_IP; do
if [ ! `grep $USER_IP $IPSECTEMP` ]; then
USER_NAME=`cat /var/state/dhcp/dhcpd.leases | grep "$USER_IP " | tr -s ' ' | cut -d " " -f 4`
USER_MAC=`grep "$USER_IP " /proc/net/arp | tr -s ' ' | cut -d " " -f 4`
cat << CLEOF
<tr>
<td class="row2 style7"><div align="center">$USER_NAME</div></td>
<td class="row2 style7"><div align="center">$USER_IP</div></td>
<td class="row2 style7"><div align="center">$USER_MAC</div></td>
</tr>
CLEOF
fi
done






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts