在 Bash 中用两个连续的分隔符分割一个字符串

时间:2021-05-06 10:45:58

标签: bash split delimiter

以下是 Windows DHCP 租用文件的摘录:

10.11.1.3       Infinite    DHCP    5c497d1ee201        xxxx    yyyyy
10.11.1.4   PC-name Infinite    DHCP    0002025e611e        xxxx    yyyyy

我想获得可变的 IP 和 MAC。所以这是我解析每一行的方式:

 IFS=$'\t' read -r -a array <<< "$line"
 ip=${array[0]}
 mac=${array[3]}

问题是第一行没有名字,所以我在IP和infinite之间有两个连续的标签。所以使用这段代码,第一行被正确解析,但在第二行,我在变量 mac 中得到“DHCP”。

我该如何纠正? 谢谢

2 个答案:

答案 0 :(得分:1)

您可以使用带有制表符的 awk 作为输入字段分隔符:

awk -F '\t' '{print $1, $5}' file

10.11.1.3 5c497d1ee201
10.11.1.4 0002025e611e

答案 1 :(得分:1)

我会改用 readarray

$ line=$'10.11.1.3\t\tInfinite\tDHCP\t5c497d1ee201\txxxx\tyyyyy'
$ readarray -d $'\t' -t array <<< "$line"
$ declare -p array
declare -a array=([0]="10.11.1.3" [1]="" [2]="Infinite" [3]="DHCP" [4]="5c497d1ee201" [5]="xxxx" [6]=$'yyyyy\n')

如果尾随换行有问题,要么手动修剪它,要么附加一个制表符来输入并限制它。

$ readarray -d $'\t' -t -n 7 array <<< "$line"$'\t'
$ declare -p array
declare -a array=([0]="10.11.1.3" [1]="" [2]="Infinite" [3]="DHCP" [4]="5c497d1ee201" [5]="xxxx" [6]="yyyyy")
相关问题