bash中通过重定向调用awk时多行输入参数同行显示的问题
问题原因
问题出在输入传递的方式上:<<< "$@"会把所有传入的参数拼接成单个空格分隔的字符串作为awk的输入,所以awk只处理一行数据,自然不会按参数分行打印。
修复方案
把输入传递方式从<<< "$@"改成用printf "%s\n" "$@"通过管道传递给awk,这样每个参数会被单独作为一行输入给awk,符合预期的分行打印需求。
修改后的代码:
firefly () { sgr="$( tput sgr0 )" blu="$( tput bold; tput setaf 39 )" lseq="1,2" printf "%s\n" "$@" | awk -v frg="$blu" -v rst="$sgr" -v lnum="$lseq" \ 'BEGIN { split(lnum, laggr, ",") } { found = 0 for (item in laggr) { if (laggr[item] == NR) { found = 1 ; break } } if (found) { fm="%s%s%s\n" ; printf(fm, frg, $0, rst) } else { fm = "%s\n" ; printf(fm, $0) } }' }
验证测试
执行firefly "First Line" "Second Line" "Third Line",输出会按参数分行显示,且第1、2行应用蓝色加粗样式:
First Line Second Line Third Line
补充说明
printf "%s\n" "$@"会遍历所有位置参数,为每个参数添加换行符,确保每个参数单独成一行。- 管道
|将printf的输出作为awk的标准输入,awk逐行处理时,NR(当前行号)能正确对应每个参数的位置,着色逻辑也能正常生效。
内容的提问来源于stack exchange,提问作者Dilna
相关产品推荐
相关产品推荐

