Você pode dizer quais interfaces são virtuais via
ls -l /sys/class/net/
que lhe dá esta saída:
[root@centos7 ~]# ls -l /sys/class/net/
total 0
lrwxrwxrwx. 1 root root 0 Mar 20 08:58 ens33 -> ../../devices/pci0000:00/0000:00:11.0/0000:02:01.0/net/ens33
lrwxrwxrwx. 1 root root 0 Mar 20 08:58 lo -> ../../devices/virtual/net/lo
lrwxrwxrwx. 1 root root 0 Mar 20 08:58 virbr0 -> ../../devices/virtual/net/virbr0
lrwxrwxrwx. 1 root root 0 Mar 20 08:58 virbr0-nic -> ../../devices/virtual/net/virbr0-nic
A partir daí, você pode grep para filtrar apenas interfaces não virtuais:
ls -l /sys/class/net/ | grep -v virtual
Outra opção é usar esse pequeno script, adaptado de esta resposta , que imprime o nome de todas as interfaces que não têm um endereço MAC de 00: 00: 00: 00: 00: 00, ou seja, físico:
#!/bin/bash
for i in $(ip -o link show | awk -F': ' '{print $2}')
do
mac=$(ethtool -P $i)
[[ $mac != *"00:00:00:00:00:00"* ]] && echo "$i"
done