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.