Назначьте две переменные за один проход с помощью awk - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть журнал, который каждую минуту получает следующие данные:

ID: Unit3443 IP: 192.168.1.1 MAC: 00:20:c0:04:e8:ab
ID: Unit2222 IP: 192.168.2.2 MAC: 00:40:c0:05:e8:bc

Я беру последнюю строку с хвостом -1 / Файл

Можно ли назначить обе эти записипеременная одним махом?В настоящее время у меня есть

UnitID=`tail -1 $File|awk '{print $1}'`
UnitIP=`tail -1 $File|awk '{print $2}'`

Это работает, но требует, чтобы файл был прочитан дважды, и меня беспокоит, что во время второго чтения вывод tail-1 больше не будет прежним.

Можно ли назначить обе эти переменные в одном чтении строки?

Ответы [ 4 ]

0 голосов
/ 12 сентября 2018

Вы можете сделать это:

read UnitID UnitIP < <(awk 'END{print $2, $4}' file)

Результат теста

echo $UnitID
Unit2222
echo $UnitIP
192.168.2.2

Как любезно указывает @EdMorton в комментариях, не все варианты awk сохраняют переменные $ 0 .. $ NF в разделе END, поэтому, надеюсь, более широкое применение имеет следующее:

read UnitID UnitIP < <(awk '{a=$2; b=$4} END{print a,b}' file)
0 голосов
/ 11 сентября 2018

Другой вариант, вместо использования read, предложенного @PesaThe, - сделать tail за один раз и использовать результат дважды, чтобы избежать проблем при изменении файла между tail с.

LINE="$(tail -1 "$File")"
UnitID="$(echo "$LINE" | awk '{print $1}')"
UnitIP="$(echo "$LINE" | awk '{print $2}')"

Примечание: я также изменил образец, чтобы использовать $() вместо обратных кавычек - работает так же, но легче понять.

0 голосов
/ 12 сентября 2018
arr=( $(tail -1 "$file" | awk '{print $1, $2}') )
UnitID=${arr[0]}
UnitIP=${arr[1]}

или

id=0
ip=1
unit=( $(tail -1 "$file" | awk '{print $1, $2}') )
echo "${unit[id]}"
echo "${unit[ip]}"

или

line=$(tail -1 "$file" | awk '{print $1, $2}')
UnitID="${line% *}"
UnitIP="${line#* }"
0 голосов
/ 11 сентября 2018

Вы можете использовать встроенную read вместо awk:

IFS=$' \t' read -r Unit{ID,IP} _ <<< "$(tail -1 "$file")"
$ declare -p Unit{ID,IP}
declare -- UnitID="Unit2222"
declare -- UnitIP="192.168.2.2"

Или, если ваш входной файл действительно соответствует обновленному формату (я не вижу, как ваш оригинальный код может работать):

IFS=$' \t' read -r _ UnitID _ UnitIP _ <<< "$(tail -1 "$file")"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...