[英]Assign two variables in one pass with awk
我有一个日志,每分钟都会收到以下数据:
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 / File的最后一行
是否可以一口气将这两个条目分配给变量? 目前我有
UnitID=`tail -1 $File|awk '{print $1}'`
UnitIP=`tail -1 $File|awk '{print $2}'`
这可行,但是它要求文件被读取两次,而我担心的是在第二次读取期间,tail -1的输出将不再相同。
是否可以在一次读取的行中同时分配这两个变量?
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#* }"
您可以使用内置的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")"
除了使用@PesaThe建议的read
另一种替代方法是一次性完成tail
,并两次使用结果,以避免在文件tail
之间更改时出现问题。
LINE="$(tail -1 "$File")"
UnitID="$(echo "$LINE" | awk '{print $1}')"
UnitIP="$(echo "$LINE" | awk '{print $2}')"
注意:我也将示例更改为使用$()
而不是反引号-的工作方式相同,但更容易正确。
您可以这样做:
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.