Como outros já notaram, o buffer de linha de grep
é a causa óbvia do seu problema.
No entanto, existem outros problemas com o que você está fazendo que não são tão óbvios.
Para começar, parece que você está usando sed
para adicionar apóstrofos ao início e ao final de cada linha de saída para que você possa alimentá-lo em xargs
. Isso nem é remotamente necessário - xargs
tem -d
opção que você pode usar para dizer que use novas linhas como delimitador: por exemplo, xargs -d'\n' -r
(a opção -r
serve para garantir que xargs
não faça nada se não houver linhas de entrada)
Em segundo lugar, você está usando expressões regulares para analisar dados do json. Isso não é confiável, extremamente difícil ou mesmo impossível de se acertar com estruturas complexas / aninhadas, frágeis e propensas a quebrar na barra de um chapéu, exatamente pelas mesmas razões que usar regexps para analisar XML ou HTML não é confiável, extremamente difícil e frágil. Não analise XML ou HTML com expressões regulares . não funciona . O mesmo se aplica ao json .
Em vez disso, você deve usar algo como jq
ou jsonpipe
para extrair campos dos dados do json. Por exemplo:
jq -c 'select(.twNotif.action == "add")' file.txt |
xargs -d'\n' -r -L 1 -P 5 ./testscript.sh
Se você quisesse enviar o valor do campo de ação para xargs
(sem as aspas duplas), poderia fazer assim:
jq 'select(.twNotif.action == "add") | .twNotif.action' file.txt |
sed -e 's/"//g' |
xargs -d'\n' -r -L 1 -P 5 ./testscript.sh
Usar jsonpipe
e awk
provavelmente seria mais fácil para um trabalho como esse:
jsonpipe < file.txt |
awk '$1 == "/twNotif/action" {gsub(/"/,""); print $2}' |
xargs -d'\n' -r -L 1 -P 5 ./testscript.sh
(observe o redirecionamento aqui, ao contrário de jq
, jsonpipe
funciona apenas com stdin).
BTW, jsonpipe
transforma dados json em um formato orientado a linha adequado para uso com ferramentas orientadas a linha como sed
, grep
, awk
, etc. Por exemplo:
$ jsonpipe < file.txt
/ {}
/twNotif {}
/twNotif/originator "api"
/twNotif/chain "test"
/twNotif/txId "08640-0050568a5514"
/twNotif/version "1.0"
/twNotif/msgType "api"
/twNotif/twData {}
/twNotif/twData/api {}
/twNotif/twData/api/hostId "007bdcc5"
/twNotif/twData/api/user "test"
/twNotif/twData/api/cmdTxt "100599"
/twNotif/action "add"
/twNotif/store "test"
/twNotif/msgTime 1467280648.971042
É mais fácil trabalhar com jq
, especialmente se você não precisa de saída formatada em json.
Também é útil para listar a estrutura de e os campos / elementos em um arquivo json no formulário que pode ser facilmente usado com jq
. por exemplo:
$ jsonpipe <file.txt | awk '{gsub(/\//,"."); print $1}'
.
.twNotif
.twNotif.originator
.twNotif.chain
.twNotif.txId
.twNotif.version
.twNotif.msgType
.twNotif.twData
.twNotif.twData.api
.twNotif.twData.api.hostId
.twNotif.twData.api.user
.twNotif.twData.api.cmdTxt
.twNotif.action
.twNotif.store
.twNotif.msgTime