uniq имеет опцию подсчета вхождений
grep -f fileA.txt fileB.txt | uniq -c
Однако имейте в виду, что если у вас есть дубликаты в вашем файле A, подсчет будет неверным, так как он будет искать их несколько раз. В этом случае сначала запустите файл A через uniq, чтобы удалить дубликаты, а затем используйте его для шаблонов.
Вы можете отфильтровать его в новый файл или обработать файл построчно и запустить его.
while read keyword; do grep $keyword fileB.txt; done < fileA.txt | uniq -c
В идеальной ситуации? Перепишите это как правило udev, чтобы оно срабатывало автоматически при подключении. Его нужно будет оценивать после других правил, так что любое переименование интерфейса уже произошло к тому времени, когда оно будет оценено (/etc/udev/rules.d/99-x-local.conf
, вероятно, это место для его размещения ), но основное правило должно выглядеть примерно так:
SUBSYSTEM=="net", ENV{ID_BUS}=="usb", ENV{ID_USB_DRIVER}=="rndis_host", ACTION=="add", RUN{program}+="/bin/sh -c 'echo $env{INTERFACE} > /var/tmp/myfile'"
Первые четыре части точно соответствуют событию, генерируемому при подключении устройства, а точнее:
SUBSYSTEM=="net"
соответствует сетевым устройствам ENV{ID_BUS}=="usb"
соответствует только тем сетевым устройствам, которые подключены через USB. ENV{ID_USB_DRIVER}=="rndis_host"
соответствует только USB-устройствам, которые используют драйвер хост-устройства RNDIS (, стандартный драйвер, используемый телефонами Android (, и я думаю, что Windows и Blackberry также )для USB-модема. ACTION=="add"
соответствует только событиям горячего подключения (, поэтому это запускается только при подключении устройства, хотя вы можете так же легко добавить второе подобное правило, соответствующее действию «удалить», чтобы что-то делать, когда телефон отключается ). Последний элемент добавляет команду в очередь вещей, которую udev вызовет, когда обработка правила будет завершена. В этом случае добавляется вызов оболочки, который запишет имя интерфейса в нужное место (udev сам заменит $env{INTERFACE}
фактическое имя интерфейса ).
Я не могу гарантировать, что это будет работать во всех случаях, но, по крайней мере, похоже, что это работает на моем Nexus 6P и теоретически должно работать на большинстве телефонов Android.
Если порядок не имеет значения, вы можете просто просмотреть все каталоги в /sys/class/net/
, пока не найдете тот, который работает и не является петлевым устройством:
for interface in /sys/class/net/*
do name=${interface##*/} # just the final directory
state=$(<$interface/operstate) # read the file
[ "$name" = lo ] && continue # if lo continue to next
[ "$state" = up ] || continue # if not up continue to next
echo $name >/var/tmp/myfile
break # stop
done