我正在将一些值保存到数组中,并且在执行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
答案 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