Я использую numfmt
для преобразования удаленного файла Content-Length
из байтов в формат IEC, т.е.21M
$ curl -sI http://jruby.org.s3.amazonaws.com/downloads/1.7.12/jruby-bin-1.7.12.tar.gz|grep Length|cut -d' ' -f2|numfmt --from=auto --to=iec
'numfmt: invalid suffix in input: '21981488
Озадачен, почему numfmt жалуется на недопустимый суффикс. Когда я разделяю команду и проверяю вывод cut
, и вручную вывожу значение в numfmt
, все работает как и ожидалось
$ curl -sI http://jruby.org.s3.amazonaws.com/downloads/1.7.12/jruby-bin-1.7.12.tar.gz|grep Length|cut -d' ' -f2 -
21981488
$ echo 21981488|gnumfmt --from=auto --to=iec
21M
Я что-то упустил?
решение1
Кажется, что вывод curl
содержит возврат каретки ичислобудучи переданным в numfmt
включает один. Вы можете удалить это перед передачей в numfmt
:
curl ... | awk -F: '/Length/{sub("\r", "", $2); print $2}' | numfmt ...
Более того, обратите внимание, что grep
and cut
обычно можно заменить альтернативной одиночной командой.
решение2
В coreutils-8.21 была ошибка, из-за которой мы неправильно цитировали ошибочное содержимое. Если вы запустите уже выпущенную версию 8.22, то получите более очевидную ошибку:
numfmt: invalid suffix in input: ‘21981488\r’
Обратите внимание, если после числа есть пробелы или табуляции, то numfmt проигнорирует их (так как использует isblank()), но для игнорирования \r потребуется использовать isspace(). Игнорирование только пробелов — это правильно, я думаю.