Bash 使用awk在一次过程中分配两个变量

Bash 使用awk在一次过程中分配两个变量,bash,awk,Bash,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 我用tail-1/文件抓取最后一行 是否可以一次性将这两个条目分配给变量?目前我有 UnitID=`tail -1 $File|awk '{print $1}'` UnitIP=`tail -1 $File|awk '{print $2}'` 这是可行的,

我每分钟都会收到以下数据日志:

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
我用tail-1/文件抓取最后一行

是否可以一次性将这两个条目分配给变量?目前我有

UnitID=`tail -1 $File|awk '{print $1}'`
UnitIP=`tail -1 $File|awk '{print $2}'`
这是可行的,但它需要读取两次文件,我关心的是在第二次读取期间,tail-1的输出将不再相同

是否可以在一次读取行时分配这两个变量?

您可以使用读取内置项而不是awk:

或者,如果您的输入文件确实遵循更新的格式,我不知道您的原始代码如何工作:

IFS=$' \t' read -r _ UnitID _ UnitIP _ <<< "$(tail -1 "$file")"
您可以使用read内置而不是awk:

或者,如果您的输入文件确实遵循更新的格式,我不知道您的原始代码如何工作:

IFS=$' \t' read -r _ UnitID _ UnitIP _ <<< "$(tail -1 "$file")"

另一种替代@PesaThe建议的read的方法是一次完成tail并使用两次结果,以避免在tail之间更改文件时出现问题


注意:我还将示例更改为使用$而不是backticks-工作方式相同,但更容易正确。

另一种替代@PesaThe建议使用read的方法是一次完成尾部并使用两次结果,以避免在尾部之间更改文件时出现问题

arr=( $(tail -1 "$file" | awk '{print $1, $2}') )
UnitID=${arr[0]}
UnitIP=${arr[1]}
注意:我还将示例更改为使用$而不是backticks-工作方式相同,但更容易正确

arr=( $(tail -1 "$file" | awk '{print $1, $2}') )
UnitID=${arr[0]}
UnitIP=${arr[1]}
或:

或:

或:

或:

您可以这样做:

read UnitID UnitIP < <(awk 'END{print $2, $4}' file)
正如@EdMorton在评论中善意地指出的,并非所有awk变体都在结尾部分保留$0..$NF变量,因此以下内容有望更广泛地适用:

read UnitID UnitIP < <(awk '{a=$2; b=$4} END{print a,b}' file)
您可以这样做:

read UnitID UnitIP < <(awk 'END{print $2, $4}' file)
正如@EdMorton在评论中善意地指出的,并非所有awk变体都在结尾部分保留$0..$NF变量,因此以下内容有望更广泛地适用:

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

这起作用了,但我本应该更清楚。它读取的文件除了单元和ip之外还有其他信息。例如ID:Unit3443 IP:192.168.1.1 | MAC:00:20:c0:04:e8:ab@teamg如果这仍然不起作用,请在问题中包含实际输入。@PesaThe,它不允许我编辑原始问题。请尝试此操作。无论如何,如果你原来的awk有效,那么read-as-now也应该有效。要处理ID:和IP字,你需要read-r\ID\uip\uuu这个有效,但我应该更清楚。它读取的文件除了单元和ip之外还有其他信息。例如ID:Unit3443 IP:192.168.1.1 | MAC:00:20:c0:04:e8:ab@teamg如果这仍然不起作用,请在问题中包含实际输入。@PesaThe,它不允许我编辑原始问题。请尝试此操作。无论如何,如果您原来的awk工作正常,那么read-as-now也应该工作。要处理ID:和IP字,您需要read-r uid uip u。末尾部分的$2、$4等inc.$0的值未由POSIX定义。对于某些awk,它们将包含最后一行读取的值,对于其他awk,它们将为零或null。为了避免未定义的行为,您必须执行awk'{a=$2;b=$4}END{print a,b}'或awk'{split$0,f}END{print f[1],f[2]}'或类似操作。或者只说明这将在哪个AWK中工作,例如gawk。末尾部分的$2、$4等inc.$0的值未被POSIX定义。对于某些awk,它们将包含最后一行读取的值,对于其他awk,它们将为零或null。为了避免未定义的行为,您必须执行awk'{a=$2;b=$4}END{print a,b}'或awk'{split$0,f}END{print f[1],f[2]}'或类似操作。也就是说,AWK将工作在什么状态,例如GAWK。你应该考虑使用set -f,以防万一:或者使用RealStale-T ARR<你应该考虑使用set -F,以防万一:或者使用RealStal-T ARR <
echo $UnitID
Unit2222
echo $UnitIP
192.168.2.2
read UnitID UnitIP < <(awk '{a=$2; b=$4} END{print a,b}' file)