O caractere "defeituoso" no parâmetro $POS
é EOL. HTTP usa CRLF como final de linha. Isso dá por exemplo:
< X-POSITION: xxxxxxxx\r\n
Isso dá ao campo 3 em awk
como xxxxxxxx\r
.
Usando print
em awk
, você também reintroduz a última nova linha, \n
, mas como sua expressão não é citada, isso é perdido.
Você pode ver isso fazendo algo como:
curl -v "http://ws.foo.bar/_consume?position=$POS" 2>&1 | cat -v
Aqueles ^M
s no final das linhas indicam \r
.
Ou:
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.
Esse último 0d
é um CR. (Opcionalmente, execute ascii
no prompt de comando.)
Também não é necessário misturar grep
e awk
como awk
muito bem por si só.
Para entrar no caminho certo, isso pode ser um começo:
pos=$(curl -v "http://foo.x/pos=$pos" 2>&1 | awk -vRS="\r\n" '/^< X-POSITION:/{printf "%s", $3}')
Aqui, defina o RS
, ou separador de registro, em awk
para CRLF,
... mas isso só lhe daria o token, não o conteúdo.
Supondo que você não precise realmente imprimir o conteúdo na tela, mas salvá-lo no arquivo de uma maneira poderia ser:
pos=$(curl -sD - -o "$pos.out" "http://foo.x/?position=$pos" | awk -vRS="\r\n" '/^X-POSITION:/{printf "%s", $2}')
Herre nós redirecionamos os dados do cabeçalho para stdout
por -D -
e salvamos o conteúdo para o arquivo por -o "$pos.out"
.
Outra vantagem é que você só analisa os dados do cabeçalho.