Shell脚本问题:如何让awk与grep输出在同一行?
解决Shell脚本多命令同行输出及awk参数传递问题
我来帮你梳理问题并拆解解决方案的核心思路:
需求回顾
你编写的getinfo.sh脚本要实现以下目标:
- 遍历所有包含
FILENAME1的子文件夹 - 输出子文件夹名称、
FILENAME1中最后一行含Search_term的内容,以及(当传入参数n时)FILENAME2的第n行内容 - 所有信息必须在同一行输出
原脚本的问题分析
你遇到的核心问题出在输出的换行控制和缓冲区上:
- 使用
grep默认输出(带换行)时,内容会换行但逻辑正常 - 改用
printf后,awk的输出没有跟在前序命令结果后,反而在脚本执行完毕才出现在命令行——这是因为不同命令的输出缓冲区刷新时机不同,加上部分命令默认带换行,导致输出顺序混乱
修复后的解决方案代码
#!/bin/bash IFS=$'\n' while read -r fname ; do pushd $(dirname "${fname}") > /dev/null { printf '%q' "${PWD##*/}" grep 'Search_term' FILENAME1 | tail -1 } | tr -d '\n' if [ "$1" -eq "$1" ] 2>/dev/null then awk '{ if(NR==n) printf "%s",$0 }' n="$1" FILENAME2 fi printf "\n" popd > /dev/null done < <(find . -type f -name 'FILENAME1')
关键修复点解释
合并前序输出并去除换行
把输出文件夹名的printf和提取FILENAME1目标行的grep | tail放到大括号{}中,通过tr -d '\n'去掉这两个命令输出的换行符,确保内容连续输出在同一行。参数合法性校验
加入if [ "$1" -eq "$1" ] 2>/dev/null判断第一个参数是否为整数,避免传入非数字参数时awk报错,同时确保只有有效参数n存在时,才执行FILENAME2的行提取逻辑。统一行结尾
每个循环末尾加入printf "\n",确保每个子文件夹的信息单独占一行,符合预期输出格式。awk参数传递优化
用n="$1"的方式向awk传递参数,避免空格或特殊字符导致的参数解析错误,确保参数值正确传递。
替代方案:用grep/sed提取第n行
如果你想用grep替代awk提取FILENAME2的第n行,可以把awk代码替换为:
grep -n "^" FILENAME2 | grep "^$1:" | cut -d: -f2-
或者更高效的sed版本:
sed -n "${1}p" FILENAME2
这两个命令都能实现提取第n行的效果,可根据习惯选择。
内容的提问来源于stack exchange,提问作者NorrinRadd
相关产品推荐
相关产品推荐

