如何将awk处理后的输出传入非标准命令cfgbbchan
问题:将处理后的每行输出作为参数执行cfgbbchan命令
我通过以下命令处理showbbchan的输出:
root@amc-d24a4-rf4:~# for x in {0..19}; do showbbchan $x | grep 60.2; done | sed 's/://g' | awk '{print $2, $3, $4, '-16.6'}'
得到输出:
11 TX3 -8100000 -16.6 12 TX1 12700000 -16.6 13 TX1 -3800000 -16.6 15 TX3 1500000 -16.6 16 TX3 -3300000 -16.6 17 TX1 17500000 -16.6 18 TX1 1000000 -16.6 19 TX3 6300000 -16.6
需要将每行输出作为完整参数传入cfgbbchan,执行类似cfgbbchan 11 TX3 -8100000 -16.6的命令,之前尝试xargs未成功,求可行实现方法。
附showbbchan输出示例:
root@amc-d24a4-rf4:~# showbbchan 1 BB_Chan 1: RX0 -17700000 Hz 0.0 dB Selected:1 Enabled:1 BB_Chan 1: TX3 -17700000 Hz -16.6 dB Selected:1 Enabled:1
可行实现方法
方法1:while循环逐行读取参数
通过while read逐行读取处理后的输出,拆分参数后直接执行命令,逻辑直观可靠:
for x in {0..19}; do showbbchan $x | grep 60.2; done | sed 's/://g' | awk '{print $2, $3, $4, "-16.6"}' | while read -r arg1 arg2 arg3 arg4; do cfgbbchan "$arg1" "$arg2" "$arg3" "$arg4" done
方法2:调整xargs参数实现
如果坚持用xargs,需指定每次传递4个参数(每行正好4个参数),避免xargs将所有参数一次性传入:
for x in {0..19}; do showbbchan $x | grep 60.2; done | sed 's/://g' | awk '{print $2, $3, $4, "-16.6"}' | xargs -n 4 cfgbbchan
-n 4表示每次从输入中取4个参数执行一次cfgbbchan,匹配每行的参数数量。
方法3:合并逻辑优化版
直接在awk中完成字段拆分并调用命令,减少管道数量提升效率:
for x in {0..19}; do showbbchan $x | grep 60.2 | awk -F: '{split($2, arr, " "); system("cfgbbchan " arr[1] " " arr[2] " " arr[3] " -16.6")}' done
通过split拆分showbbchan输出的字段,再用system直接执行cfgbbchan命令,省去中间的sed和额外管道。
内容的提问来源于stack exchange,提问作者Lucas
相关产品推荐
相关产品推荐

