Как сгенерировать новый файл журнала, содержащий MAC-адрес на основе pihole.log, который не содержал его по умолчанию

У меня есть /var/log/pihole.log , который содержит такие строки:

Nov 29 18:49:33 dnsmasq[13568]: query[AAAA] firebaselogging-pa.googleapis.com from 192.168.0.10
Nov 29 18:49:33 dnsmasq[13568]: query[A] firebaselogging-pa.googleapis.com from 192.168.0.10
Nov 29 18:49:41 dnsmasq[13568]: query[AAAA] app-measurement.com from 192.168.0.10
Nov 29 18:49:41 dnsmasq[13568]: query[A] app-measurement.com from 192.168.0.10
Nov 29 18:49:57 dnsmasq[13568]: query[AAAA] in.treasuredata.com from 192.168.0.10
Nov 29 18:49:57 dnsmasq[13568]: query[A] in.treasuredata.com from 192.168.0.10

arp - дает мне совпадение между MAC и IP:

root@raspberrypi:/var/log# arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface
192.168.0.81             ether   c8:5b:76:e1:3c:6f   C                     wlan0
192.168.0.136            ether   14:ab:c5:09:de:81   C                     wlan0
192.168.0.207            ether   68:c6:3a:a2:f4:e1   C                     wlan0
192.168.0.213            ether   60:01:94:70:e9:9c   C                     wlan0
192.168.0.67             ether   8c:fe:57:51:1d:51   C                     wlan0

Я хочу создать новый живой файл pihole2.log с MAC в конце. Это мой сценарий:

tail -f /var/log/pihole.log|grep "query" |grep -v "<name"| awk 'NR==1{print $0,"MIME_type"; next}
        { cmd = "/var/log/nico.sh " $8
          cmd | getline result
          close(cmd)
          print $1,$2,$3,$6,$8, result }'

Я использую nico.sh для выполнения поиска arp . nico.sh содержит:

#!/bin/sh
param=$1
cmd="$(arp -n|awk '$1 == x {print $3}' x=$param)"
echo $cmd

Скрипт не выполняется, пока pihole.log показывает дополнительные строки.

0
задан 7 December 2020 в 14:20

1 ответ

Этот однострочный Bash работает для меня:

tail -f /var/log/pihole.log | while read line ; do echo -n "$line" ; ip=$(echo "$line" | awk '{print $NF}') ; mac=$(arp -n | grep '^'$ip' ' | awk '{print $3}') ; [ "$mac" = "" ] && echo " xx:xx:xx:xx:xx:xx" || echo " $mac" ; done >> /var/log/pihole2.log

или в многострочной форме:

#!/bin/bash
tail -f /var/log/pihole.log | while read line ; do
  echo -n "$line"
  ip=$(echo "$line" | awk '{print $NF}')
  mac=$(arp -n | grep '^'$ip' '|  awk '{print $3}')
  [ "$mac" = "" ] && echo " xx:xx:xx:xx:xx:xx" || echo " $mac"
done >> /var/log/pihole2.log
0
ответ дан 6 December 2020 в 23:57

Другие вопросы по тегам:

Похожие вопросы: