Pular para o conteúdo

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

Responder tópico
  • Denunciar
  • Indicar

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

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

Responder tópico

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

Melhor resposta

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

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

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

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

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

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

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

Legal Daniel.

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

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

Responder tópico

Responder tópico

Entre na sua conta para responder.

Fazer login para responder