通常的方式做到这一点是发射在某一时刻一个\r
回车(CR)和省略在该行的末尾的换行符\n
或换行(LF)。由于您使用的awk
,你可以尝试:
awk '{printf "\r%s", $1} END {print ""}'
对于大多数行,它输出一个回车和外地1中的数据(不包括在最后一个换行符)。在输入结束时,它会打印一个空字符串,后跟一个换行符。其他
一种可能性是,你应该把awk
脚本您for
外循环:
for x in `cat ${PATCHLIST}`
do
if (showrev -p $x | grep $x > /dev/null 2>&1); then
touch /tmp/patchcheck/* | echo "pass" >> /tmp/patchcheck/$x
wc /tmp/patchcheck/* | tail -1
else
touch /tmp/patchcheck/* | echo "fail" >> /tmp/patchcheck/$x
wc /tmp/patchcheck/* | tail -1
fi
done | awk '{ printf "\r%s", $1} END { print "" }'
我不知道,但我认为你可以将类似的精简的重复代码的其余部分脚本:
for x in `cat ${PATCHLIST}`
do
if showrev -p $x | grep -s $x
then echo "pass"
else echo "fail"
fi >> /tmp/patchcheck/$x
wc /tmp/patchcheck/* | tail -1
done | awk '{ printf "\r%s", $1} END { print "" }'
这消除了touch
(这似乎并没有做太多),特别是不能当的touch
空输出通过管道输送到echo
其中IG优于其标准输入。它消除了if
行中的子shell;它使用grep
的-s
选项来保持安静。
我对wc
这条线还是有点怀疑。我认为你需要统计文件的数量,因为每个文件都应该包含一行(通过或失败),除非您在${PATCHLIST}
标识的文件中列出了一些补丁两次。在这种情况下,我可能会使用:
for x in `cat ${PATCHLIST}`
do
if showrev -p $x | grep -s $x
then echo "pass"
else echo "fail"
fi >> /tmp/patchcheck/$x
ls /tmp/patchcheck | wc -l
done | awk '{ printf "\r%s", $1} END { print "" }'
这将列出在/ tmp/patchcheck的文件和统计线输出的数量。这意味着您可以简单地在awk
脚本中打印$0
,因为$0
和$1
是相同的。在效率方面很重要(不是很多),这是更高效的,因为ls
只扫描一个目录,而不是让wc
打开每个文件。但它更特别是对你正在尝试做什么的更准确的描述。如果你以后要算通行证,您可以使用:
for x in `cat ${PATCHLIST}`
do
if showrev -p $x | grep -s $x
then echo "pass"
else echo "fail"
fi >> /tmp/patchcheck/$x
grep '^pass$' /tmp/patchcheck/* | wc -l
done | awk '{ printf "\r%s", $1} END { print "" }'
当然,这要追溯到读取每个文件,但你现在出了它越来越完善的信息(这就是为点球更精致的信息)。
谢谢乔纳森,这是非常有帮助的!欣赏优秀的反馈。 – Christopher 2012-03-20 02:29:14