执行此操作的常用方法是在某个点发出\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
忽略其标准输入时。它消除了行中的子shell if
;它使用-s
选项grep
来保持安静。
我还是有点怀疑这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 中的文件并计算输出的行数。$0
这意味着您可以简单地在awk
脚本中打印,因为$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 "" }'
当然,这可以追溯到读取每个文件,但是您现在可以从中获得更精炼的信息(这是对更精炼信息的惩罚)。