Talvez ajude a ter uma nova opção:
Nesse trecho não é possível reduzir os pipes agrupando o dois greps ou filtrando no awk?
Ou até eliminar o xargs?
Original:
ARRTABLES=(`iptables -nL MAC | tr [A-F,M] [a-f.m] | grep all | grep 'mac ' | awk '{ print $7 }' | xargs`)
Sugestões: Estou supondo que 'all' venha antes do 'mac ', do contrário é só inverter.
ARRTABLES=(`iptables -nL MAC | tr [A-F,M] [a-f.m] | grep 'all.*mac ' | awk '{ print $7 }' | xargs`)
ARRTABLES=(`iptables -nL MAC | tr [A-F,M] [a-f.m] | awk '/all.*mac / { print $7 }' | xargs`)
ARRTABLES=(`iptables -nL MAC | tr [A-F,M] [a-f.m] | awk '/all.*mac / { printf $7 " " }'`)
No caso do bloco for, que tal usar apenas um loop assim:
for i in ${ARRCADAST[*]}
do
echo ${ARRTABLES[*]} | grep $i >/dev/null 2>&1
if [ $? -eq 1 ]
then
iptables -I MAC 1 -m mac --mac-source $i -j RETURN
echo "Mac cadastrado: $i" fi
done
É uma sugestão baseado nas experiências que tive, não testei se funciona, mas pode ser uma alternativa para uso
[]'s
Itamar