2013-11-12 6 views
0

Я пытаюсь переписать вывод команды unix в файл, но он продолжает добавлять вывод в файл.не может перезаписать файл

wget --progress=dot http://test.com/example.zip 2>&1 | grep --line-buffered "%" | \ 
sed -u -e "s,\.,,g" | awk '{printf(" %4s", $2)}' > log.txt 

Список литературы можно найти здесь: Tutorial

Это выход я получаю - log.txt

0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 1% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 2% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 3% 

Он должен быть только один процент

10% 

где я делаю неправильно?

+0

Ссылка цитируете говорит 'AWK '{Е ("\ Ь \ Ь \ Ь \ Ь% 4s", $ 2)}'' и вы опустили '\ b' которые вызывают вывод в _overwrite_. – devnull

+0

со всеми '\ b' ', вывод показывает некоторые непризнанные символы, поэтому мне пришлось их удалить. btw-выход был таким же с исходным кодом. –

+0

Символ '' \ b'' - это обратное пространство, которое хорошо работает в терминале, но не так хорошо перенаправлено на файл. Я думаю, что вам нужен совсем другой подход. – acfrancis

ответ

1

С помощью трех инструментов (grep, sed и awk) добиться того, что какой-либо один из них мог бы сделать, это знак того, что тот, кто написал оригинальный сценарий на самом деле не понимают любой из этих инструментов.

Используя только awk (и только функции POSIX AWK, AFAIK):

wget --progress=dot http://test.com/example.zip 2>&1 | 
awk 'match($0,/[0-9]{1,3}%/){printf "%4s",substr($0,RSTART,RLENGTH) >"log.txt"; 
          close("log.txt")}' 

(я только что проверил это с простака, Мок, и оригинал-AWK (используется на Mac OS X), и последний один, кажется, не понимает оператор скобка-повтор, так что вам нужно написать match($0,/[0-9]?[0-9]?[0-9]%/). с простаком, есть несколько возможных упрощений.)

а вот простое решение, используя только grep, хотя он будет вести себя почти так же, как ваш оригинал (т. е. он не будет перематывать файл в каждой строке).

wget --progress=dot http://test.com/example.zip 2>&1 | 
    grep --line-buffered -oE '[0-9]{1,3}%' 

Существует множество способов получить это, чтобы переписать файл в каждой строке; вот простой:

for PCT in $(wget --progress=dot http://test.com/example.zip 2>&1 | 
      grep --line-buffered -oE '[0-9]{1,3}%'); do 
    printf '%4s\n' $PCT > log.txt 
done 
Смежные вопросы