Tee не пишет в файл при объединении в pipe

Знак «неисправный» в параметре $ 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" .

Еще одно преимущество заключается в том, что вы анализируете только данные заголовка.

-1
11.10.2018, 18:29
2 ответа

При записи в stdout с помощью stdio вывод в файлы и каналы буферизуется блоками.

Вам нужно подождать, пока 4k или 8k (в зависимости от вашего локального стандартного ввода )не будут получены со стандартного ввода и записаны на стандартный вывод.

0
28.04.2021, 23:41

Проблема может заключаться в том, что вы направляете стандартный вывод в файл с > /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 недостаточно хорошо справлялся со сбросом вывода слишком часто

. ]
0
28.04.2021, 23:41

Теги

Похожие вопросы