Обычный способ сделать это - выдать \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
, который игнорирует его стандартный ввод.Устраняет субоболочку в строке 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 "" }'
Конечно, это возвращает нас к чтению каждого файла, но теперь вы получаете из него более точную информацию (и это наказаниедля более точной информации).