[英]Printing awk output in same line after grep
我有一个非常粗糙的脚本getinfo.sh,它可以从所有子文件夹及其子路径中所有名为FILENAME1和FILENAME2的文件中获取信息。 如果使用“ getinfo.sh n”调用脚本,则awk结果应仅从FILENAME2中选择第n行。 我希望所有信息都打印在一行中!
问题是,如果我使用print而不是printf,信息将写入新行,但是我的脚本有效。 如果我使用printf,脚本执行完后,我可以在命令属性中看到awk命令的最后一位,但是在同一行中的grep命令之后却没有设置。 总的来说,完整的行很长,但这是有意的。 您愿意告诉我我做错了什么吗?
#!/bin/bash
IFS=$'\n'
while read -r fname ;
do
pushd $(dirname "${fname}") > /dev/null
printf '%q' "${PWD##*/}"
grep 'Search_term ' FILENAME1 | tail -1
awk '{ if(NR==n) printf "%s",$0 }' n=$1 $2 FILENAME2
popd > /dev/null
done < <(find . -type f -name 'FILENAME1')
如果这更容易,我也很乐意grep第n行?
解:
#!/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'%q'“ $ {PWD ## * /}”和grep'Search_term'FILENAME1 | 尾巴-1和awk'{if(NR == n)printf“%s”,$ 0}'n = $ 1 $ 2 FILENAME2将在一行中打印
因此,首先,我们有三个命令,每个命令打印一行输出。 由于这些命令无关紧要,让我们将它们包装在函数中以简化答案:
cmd1() { printf '%q\n' "${PWD##*/}"; }
cmd2() { grep .... ; }
cmd3() { awk ....; }
要打印它们之间没有换行符,我们可以:
使用命令替换,该命令删除尾随的空换行符。 带有一些printf:
printf "%s%s%s\\n" "$(cmd1)" "$(cmd2)" "$(cmd3)"
或一些回声:
echo "$(cmd1) $(cmd2) $(cmd3)"
或附加到变量:
str="$(cmd1)" str+=" $(cmd2)" str+=" $(cmd3)" printf" %s\\n" "$str"
等等。
我们可以使用tr -d '\\n'
从流中删除换行符:
{ cmd1 cmd2 cmd3 } | tr -d '\\n' echo # newlines were removed, so add one to the end.
或者我们也可以只从前n-1
命令中删除换行符,但是我认为这不太可读:
{ cmd1 cmd2 } | tr -d'\\n' cmd3 # the trailing newline will be added by cmd3
如果我没有传递数字,则应该省略awk命令。
我看到您的awk
命令同时扩展了$1
和$2
,并且我只看到$1
作为n=$1
环境变量传递给awk
。 我不知道$2
是多少。 您可以在$#
的值上写if-s参数的数量:
if (($# == 2)); then
awk '{ if(NR==n) printf "%s",$0 }' n="$1" "$2" FILENAME2
fi
对于您要处理的每种情况也是如此。 记住正确的报价。
您的命令显示未使用的参数$2
,我删除了该参数。
您可以使用END
块在awk
的末尾添加换行符,但是在调用没有行号的脚本时还需要一个额外的换行符。 echo
会做。
#!/bin/bash
IFS=$'\n'
while read -r fname ;
do
pushd $(dirname "${fname}") > /dev/null
# Add result of grep in same printf statement
printf '%s %s' "${PWD##*/}" "$(grep 'Search_term ' FILENAME1 | tail -1)"
if (( $# -eq 1 )); then
# use $1 as an awk variable, number n
# use $2 as a different file to read from
awk -v n=$1 '{ if(NR==n) printf "%s ",$0 }' FILENAME2
fi
# Add line-ending
echo
popd > /dev/null
done < <(find . -type f -name 'FILENAME1')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.