在打印数组后添加新行

时间:2018-10-27 13:02:24

标签: linux bash

我正在将一些值保存到数组中,并且在执行printf时不会出现换行符

declare array=( $(echo $line | sed 's/"//g' | awk '{printf $NF}') )
printf "%s " "${array[@]}"

输出:

Value1 Value2 Value3

但是光标在同一行上,需要重新换行。

我要执行的其他操作是添加另一个printf:

declare array=( $(echo $line | sed 's/"//g' | awk '{printf $NF}') )
printf "%s " "${array[@]}"; printf "%s\n"

但是在这种情况下的输出是:

Value1
Value2
Value3

怎么了? 完整的代码是:

while IFS="" read -r line; do
    declare array=( $(echo $line | sed 's/"//g' | awk '{printf $NF}') )
    printf "%s " "${array[@]}"
done < <(tcpdump -lni eth0 -vvv -s 0 port bootps | grep --line-buffered -E -i 'client-id|requested-ip|hostname')

和输出:

6c:56:97:3c:6f:51 10.0.1.10 WINC

tcpdump的输出是:

[root@PIDORA ~]# tcpdump -lni eth0 -vvv -s 0 port bootps
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
17:21:09.177072 IP (tos 0x0, ttl 64, id 1, offset 0, flags [none], proto UDP (17), length 325)
    0.0.0.0.bootpc > 255.255.255.255.bootps: [udp sum ok] BOOTP/DHCP, Request from 6c:56:97:3c:6f:51, length 297, xid 0x3a1e3c9a, Flags [none] (0x0000)
      Client-Ethernet-Address 6c:56:97:3c:6f:51
      Vendor-rfc1048 Extensions
        Magic Cookie 0x63825363
        DHCP-Message Option 53, length 1: Request
        Client-ID Option 61, length 7: ether 6c:56:97:3c:7f:51
        Requested-IP Option 50, length 4: 10.0.1.14
        MSZ Option 57, length 2: 1500
        Vendor-Class Option 60, length 15: "WINC"
        Hostname Option 12, length 10: "WINC"
        Parameter-Request Option 55, length 3: 
          Subnet-Mask, Default-Gateway, Domain-Name-Server
        END Option 255, length 0

1 个答案:

答案 0 :(得分:0)

在使用单个目标变量(在您的情况下为IFS)调用read之前设置line是非常不寻常的,因为IFS用于拆分一行输入成几个字

例如:

read var0 var1 var2 <<< "abc def ghi"
printf 'var0="%s" var1="%s" var2="%s"\n' "$var1" "$var2" "$var3"

将打印:var0="abc" var1="def" var2="ghi"

使用IFS=""

unset var0 var1 var2
IFS="" read var0 var1 var2 <<< "abc def ghi"
printf 'var0="%s" var1="%s" var2="%s"\n' "$var1" "$var2" "$var3"

您将获得:var0="abc def ghi" var1="" var2=""

我的猜测是您设置了IFS="",因为您实际上认为IFS控制着行的分割方式,该参数由-d的{​​{1}}选项控制。 / p>

考虑到这一点,您可能要尝试执行以下操作:

read

但是它不起作用。 while read -r -d "" line; do declare -a array=($(sed 's/"//g' <<< "$line" | awk '{print $NF}')) printf '%s ' "${array[@]}" printf '\n' done < <(tcpdump -lni eth0 -vvv -s 0 port bootps | grep --line-buffered -E -i 'client-id|requested-ip|hostname') 到达read时返回非零错误代码,如果忽略每个换行符,它将在第一次调用时返回。那只能证明一件事:while循环是无用的。

如果我是对的,那么以下“单行代码”应该可以正常工作:

EOF