如何在GNU Parallel输出的名称字段中添加序列号后四位
问题描述
我通过以下命令获取设备IP列表:
# 从ADB服务器获取所有设备 wIP=$(adb devices | tail -n +2 | grep "device" | cut -f1 | cut -f1 -d\ );
$wIP 的结果为:
192.168.1.10 192.168.1.20
接着用两条命令获取设备名称和序列号:
wName=$(parallel adb -s {} shell getprop ro.product.display_name ::: "$wIP"); wSerial=$(parallel adb -s {} shell getprop ro.serialno ::: "$wIP");
$wName 的结果为:
Samsung Watch4 Samsung Watch4
$wSerial 的结果为:
RFAR82JDGLJ RFAR82JPRFC
之后用以下命令打印信息:
printf "%-22s %-22.27s %-14.12s\n" "IP" "Name" "Serial" printf "%-22s %-22.27s %-14.14s\n" "$wIP" "$wName" "$wSerial"
最终输出:
IP Name Serial 192.168.1.10 Samsung Watch4 RFAR82JDGLJ 192.168.1.20 Samsung Watch4 RFAR82JPRFC
现在需要修改代码,让Name字段带上对应序列号的最后四位(放在括号里),得到如下输出:
IP Name Serial 192.168.1.10 Samsung Watch4 (DGLJ) RFAR82JDGLJ 192.168.1.20 Samsung Watch4 (PRFC) RFAR82JPRFC
原完整代码:
wIP=$(adb devices | tail -n +2 | grep "device" | cut -f1 | cut -f1 -d\ ); wName=$(parallel adb -s {} shell getprop ro.product.display_name ::: "$wIP"); wSerial=$(parallel adb -s {} shell getprop ro.serialno ::: "$wIP"); printf "%-22s %-22.27s %-14.12s\n" "IP" "Name" "Serial" printf "%-22s %-22.27s %-14.14s\n" "$wIP" "$wName" "$wSerial"
解决方案
要实现需求,需将设备的名称、序列号按行配对,给每个名称拼接对应序列号的最后四位,再按格式打印。修改后的完整代码如下:
wIP=$(adb devices | tail -n +2 | grep "device" | cut -f1 | cut -f1 -d\ ); wName=$(parallel adb -s {} shell getprop ro.product.display_name ::: "$wIP"); wSerial=$(parallel adb -s {} shell getprop ro.serialno ::: "$wIP"); # 打印表头 printf "%-22s %-28s %-14s\n" "IP" "Name" "Serial" # 将IP、名称、序列号按行对应,处理后逐行打印 paste <(echo "$wIP") <(echo "$wName") <(echo "$wSerial") | while read -r ip name serial; do # 截取序列号最后四位 serial_suffix=${serial: -4} # 拼接带后缀的新名称 new_name="$name ($serial_suffix)" # 按格式打印单条设备信息 printf "%-22s %-28s %-14s\n" "$ip" "$new_name" "$serial" done
关键步骤说明
- 按行配对设备信息:用
paste命令把wIP、wName、wSerial的内容按行对齐,确保每一行对应同一台设备的三个参数。 - 截取序列号后缀:通过bash字符串截取语法
${serial: -4}提取序列号的最后四位。 - 拼接并打印:将原名称与序列号后缀拼接成新名称,调整
printf的格式宽度(如%-28s)适配新名称长度,保证排版整齐。
内容的提问来源于stack exchange,提问作者Sasha Milic
相关产品推荐
相关产品推荐

