Диагностика
Когда вы используете этот скрипт, как это:
java javaprog | myScript
и myScript
содержит:
#!/bin/bash
echo $0
echo $#
echo $1
Тогда выводом скрипта будет его имя (myScript
) из echo $0
, количество аргументов, переданных ему (0) из echo $#
, и первый аргумент (отображается пустая строка ) из echo $1
. Затем скрипт завершает работу (успешно). Проблема не имеет ничего общего с буферизацией; все это связано с тем, что скрипт ничего не читает из стандартного ввода. Даже тривиальная модификация будет улучшением:
#!/bin/bash
while read data; do echo $data; done
Это более медленная форма cat
, за исключением того, что она нормализует случайные последовательности пробелов и табуляций в единичные пробелы, удаляя начальные и конечные пробелы из строки. По крайней мере, он продемонстрировал бы сценарий, обрабатывающий вывод программы Java.
Пытаясь awk
Чтобы сделать то, что вам нужно, вам, вероятно, следует заменить это awk
программой или чем-то подобным. Это первый черновик, но у него есть шанс на работу:
awk '{for(i = 1; i <= NF; i++) { x = "0x" $i + 0; printf(" %d", x); printf "\n";}'
Здесь написано «для каждой строки (потому что перед открывающей скобкой нет шаблона)», do »для каждого из полей 1..NF, преобразовать поле в явную шестнадцатеричную строку с префиксом 0x
и добавить 0, затем выведите значение в виде десятичного числа (доверяя awk
для преобразования строки, такой как '0xC9', в число).
Использование Perl
К сожалению, небольшое тестирование показывает, что это не работает; проблема заключается в получении значения, отличного от 0, для x
. Итак, ... время вернуться к Perl в режиме awk
-эмуляции:
$ echo '00 C9 28 13 A0 FF 01' |
> perl -na -e 'for ($i = 0; $i < scalar(@F); $i++) { printf(" %d", hex $F[$i]); }
> printf "\n";'
0 201 40 19 160 255 1
$
Это работает - это даже довольно легко понять. Опция -n
означает «читать каждую строку данных и выполнять команды в сценарии в каждой строке (но не печатать $_
в конце)». Опция -a
в сочетании с -n
(как здесь, или -p
, что похоже на -n
, за исключением того, что она печатает $_
автоматически) означает «автоматически разбить входные данные на массив @F
. Затем скрипт обрабатывает каждый элемент @F
в каждой строке (довольно многословно), используя функцию hex
для преобразования строки в $F[$i]
в число, а затем печатает это число с printf()
. Детальность можно уменьшить (это равно Perl: есть больше, чем один способ сделать это, или TMTOWTDI - tim-toady) с помощью:
$ echo '00 C9 28 13 A0 FF 01' |
> perl -na -e 'foreach my $i (@F) { printf(" %d", hex $i); } printf "\n";'
0 201 40 19 160 255 1
$
Тот же результат, меньше кода. Там могут быть более сокращенные методы; это достаточно компактно, не будучи полностью неразборчивым.