С помощью следующей команды я могу обнаружить устройства, подключенные к сети. Эта команда прослушивается в системе, поэтому она постоянно ожидает появления результатов.
tcpdump -lni eth0 -vvv -s 1500 '((udp port 67) and (udp[247:4] = 0x63350103))' | grep --line-buffered -E -i 'client-id|requested-ip|hostname' | awk '{print $NF}'
Как только кто-то подключается к сети, результат выглядит следующим образом. 3 строки, которые показывают MAC, IP и имя хоста в этом порядке. Например:
98:9f:62:51:9d:2e
10.0.2.11
iPhone
Если кто-то подключится, появятся еще 3 линии и т. Д.
Я хотел бы иметь возможность представить 3 результата для каждого соединения следующим образом:
98:9f:62:51:9d:2e 10.0.2.11 iPhone
Есть ли способ управления этим выходом?
Если твоя проблема ограничивается тем, чтобы быть должным печатать 3 lГ-neas в раз, со мной случается, что podrГ-схвати, решать это с рукописного шрифта awk
asГ-:
awk '{printf (NR%3==0) ? [110] "\n" : [110]" "}'
BГЎsicamente мы печатаем с printf
(которые не добавляют разрыв lГ-nea) и в случае nГєmero lГ-nea будьте mГєltiplo 3 (NR%3==0)
добавляем \n
.
EstГЎ очень довольно она soluciГіn, который предлагает Патрисио Морачо , является очень интересным способом использовать NR
.
мы можем давать Ему возвращение с чем-то включенным mГЎs idiomГЎtico:
awk 'ORS=(NR%3) ? FS : RS'
ВїCГіmo функционирует?
RS
- разделитель реестров. ORS
- разделитель реестров, напечатав их. NR
- nГєmero реестра. FS
- сельский разделитель реестра. По умолчанию, RS и ORS - "\n" и FS - место. Поэтому, мы можем делать этими неверный ход в игре : если nГєmero реестра он не mГєltiplo 3, используй как ORS место. В противоположном случае (а именно, в lГ-neas mГєltiples 3) используй RS.
В эффекты prГЎcticos: если она lГ-nea он mГєltiple 3, напечатай обычно. Если не, он печатает следуемая местом.
ты Можешь читать много truquillos этих в Idiomatic awk в inglГ©s .
Даже mГЎs fГЎcil - с xargs
:
xargs -n 3
Пример:
$ seq 10 | xargs -n 3
1 2 3
4 5 6
7 8 9
10
то, что его делает xargs
, состоит в том, чтобы брать аргументы, которые приходят из pipe. Сказав ему -n 3
то, что он делает, состоит в том, чтобы оказываться их вовлеченными 3 в 3.
awk '{printf (NR%3) ? [110] " " : [110]"\n"}'
, так какNR%3 == 0
не так необходим и может использоваться Ваш результат implí citamente – fedorqui 28.11.2019, 09:55