Знак «неисправный» в параметре $ POS
- EOL. HTTP использует CRLF в качестве окончания строки. Это дает, например:
< X-POSITION: xxxxxxxx\r\n
Это дает поле 3 в awk
как xxxxxxxx \ r
.
Используя print
в awk
, вы также повторно вводите последнюю новую строку, \ n
, но поскольку ваше выражение не цитируется, это потерянный.
Вы можете увидеть это, выполнив что-то вроде:
curl -v "http://ws.foo.bar/_consume?position=$POS" 2>&1 | cat -v
Те ^ M
в конце строк указывают \ r
.
Или:
printf "%s" "$pos" | xxd
00000000: 7251 4141 4d54 5132 4d7a 5534 4d44 4131 rQAAMTQ2MzU4MDA1
00000010: 4d6a 6778 4d33 7838 6643 3977 5a58 4a74 MjgxM3x8fC9wZXJt
00000020: 6157 5175 6233 4a6e 6648 7838 0d aWQub3JnfHx8.
Последний 0d
является CR. (При желании введите ascii
в командной строке.)
Также нет необходимости смешивать grep
и awk
как awk
математические вычисления самостоятельно.
Чтобы встать на правильный путь, это может быть начало:
pos=$(curl -v "http://foo.x/pos=$pos" 2>&1 | awk -vRS="\r\n" '/^< X-POSITION:/{printf "%s", $3}')
Здесь можно установить RS
, или разделитель записей, в awk
на CRLF,
. .. но это даст вам только токен, а не контент.
Предполагая, что вам не нужно печатать контент на экране, но сохранить его в файл можно одним из следующих способов:
pos=$(curl -sD - -o "$pos.out" "http://foo.x/?position=$pos" | awk -vRS="\r\n" '/^X-POSITION:/{printf "%s", $2}')
Теперь мы перенаправляем данные заголовка в stdout
с помощью -D -
и сохраните содержимое в файл с помощью -o "$ pos.out"
.
Еще одно преимущество заключается в том, что вы анализируете только данные заголовка.
При записи в stdout с помощью stdio вывод в файлы и каналы буферизуется блоками.
Вам нужно подождать, пока 4k или 8k (в зависимости от вашего локального стандартного ввода )не будут получены со стандартного ввода и записаны на стандартный вывод.
Проблема может заключаться в том, что вы направляете стандартный вывод в файл с > /tmp/matdata.in
, что оставляет tee
без вывода для записи. Реорганизация команды как ' | tee /tmp/data /tmp/matdata.in &'
могла решить проблему, и я могу использовать это на своем компьютере для записи в два файла, но я не совсем уверен, так как ваша нижняя команда не сработала. Может что-то с матлабом. Вы должны попробовать это с трубой в конце, как в моей команде. В качестве альтернативы вы можете попробовать'stdbuf -i0 -o0 -e0./',file,' | tee /tmp/data /tmp/matdata.in &'
(или'./',file,' | stdbuf -i0 -o0 -e0 tee /tmp/data /tmp/matdata.in &'
)удалить буферизацию, которая может ограничить скорость, с которой вы получаете данные, если автор кода на языке C недостаточно хорошо справлялся со сбросом вывода слишком часто