繁体   English   中英

使用awk一次分配两个变量

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM