GitBash中如何用AWK按列名而非列号提取命令输出的指定列值
实现方案
1. 最终适配脚本
你可以直接使用修改后的awk命令,完美适配管道输入、多列提取需求:
awk 'BEGIN{split(ENVIRON["AWK_GETCOLS"], cols, ",")} NR==1{for(i=1;i<=NF;i++) col_map[$i]=i} {for(n in cols) if(col_map[cols[n]]) printf "%s ", $(col_map[cols[n]]);print ""}'
建议直接封装为bash别名写入~/.bashrc,日常使用更方便:
alias awkcol='AWK_GETCOLS="$1" awk '\''BEGIN{split(ENVIRON["AWK_GETCOLS"], cols, ",")} NR==1{for(i=1;i<=NF;i++) col_map[$i]=i} {for(n in cols) if(col_map[cols[n]]) printf "%s ", $(col_map[cols[n]]);print ""}'\'''
修改完配置文件后执行source ~/.bashrc即可生效。
2. 使用方式
完全符合你需要的管道调用习惯:
- 提取单列:比如提取
ps aux输出中的WINPID列ps aux | awkcol WINPID - 提取多列:多个列名用英文逗号分隔即可,比如同时提取PID、WINPID、COMMAND三列
ps aux | awkcol PID,WINPID,COMMAND
3. GitBash环境适配说明
你当前使用的4.4.23版本bash和内置awk完全兼容上述脚本,无需额外安装依赖。针对ps aux中COMMAND列带空格的场景,脚本也会完整保留整段命令内容,不会出现拆分错误。如果需要修改多列输出的分隔符,只需把脚本中printf "%s "里的空格替换为你需要的符号即可,比如换成制表符就修改为printf "%s\t"。
内容的提问来源于stack exchange,提问作者Vicky Dev
相关产品推荐
相关产品推荐

