通常的方式做到這一點是發射在某一時刻一個\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