컬 아무것도 게시하지 마세요

컬 아무것도 게시하지 마세요

아래 dev-netpro.sh 스크립트에서 $FWK(예: '8fwk3_dev 2fwk0_dev' - 최대 9단어 가능) 및 $CON(예에서는 일련의 숫자: '72 43)이 있는 경우 'curl' 아무 것도 게시되지 않습니다. 172 28021 8261 14015 325 24 524') 여러 단어 가져오기

[Expert@WAL-NEW-VSX-02:0]# cat dev-netpro.sh 
#!/bin/bash
while true; do
        FWK=$(top -b -n 1 | egrep 'fwk' |  awk '{print $9 $NF}')
        CON=$(vsx stat -l | egrep 'number' | awk '{print $3}')       
TIME=`date +"%T"` 
echo $HOSTNAME, $TIME, $FWK, $CON
echo '{"WAL-VSX-02": "['"$TIME"','"$FWK"','"$CON"']"}'
curl -ik -H "Accept: application/json" -H "Content-type: application/json" -d '{"WAL-VSX-02": "['"$TIME"','"$FWK"','"$CON"']"}' -X POST "https://10.199.107.11:8880/test"  
sleep 2 
done
[Expert@WAL-NEW-VSX-02:0]# 

아래 출력을 참조하세요.

    [Expert@WAL-NEW-VSX-02:0]# ./dev-netpro.sh 
    WAL-NEW-VSX-02, 12:53:17, 8fwk3_dev 2fwk0_dev, 72 43 172 28021 8261 14015 325 24 524
    {"WAL-VSX-02": "[12:53:17,8fwk3_dev
    2fwk0_dev,72
    43
    172
    28021
    8261
    14015
    325
    24
524]"}

......아무것도 없어

답변1

줄바꿈은 스크립트 시작 부분에서 실행되는 이 두 명령에서 나옵니다. 뒤쪽에

FWK=$(echo $FWK|tr -d '\n') CON=$(echo $CON|tr -d '\n')

효율적인! 당신의 도움을 주셔서 대단히 감사합니다

답변2

JSON 개체 내부의 콘텐츠 주위에 따옴표가 필요하고, 공백이 별도의 인수로 처리된 후 변수 내의 공백이 아무 것도 생성하지 않도록 전체 문자열을 인용해야 합니다.

echo "{\"WAL-VSX-02\": [\"$TIME\",\"$FWK\",\"$CON\"]}"

이전 방법은 문자열의 여러 구성요소 주위에 (작은따옴표)가 있었지만 변수에 공백이 있으면 쉘이 이를 별도의 문자열로 구문 분석했습니다. 이렇게 하면 전체 내용이 인용되므로 쉘은 이를 문자열로 구문 분석합니다.

답변3

JSON 문서에 임의의 문자열을 포함하려면 해당 문자열을 JSON 문자열로 올바르게 인코딩해야 합니다. 이는 다음과 같이 JSON을 이해하는 유틸리티를 사용하여 수행하는 것이 가장 좋습니다 jq.

#!/bin/bash

while true; do
    fwk=$( top -b -n 1 | awk '/fwk/ { print $9 $NF }' )
    con=$( vsx stat -l | awk '/number/ { print $3 }' )

    printf -v now '%(%T)T' -1

    jq -cn \
        '{ "WAL-VSX-02": $ARGS.positional }' \
        --args "$now" "$fwk" "$con" |
    curl --silent --show-error \
        --json @- 'https://10.199.107.11:8880/test'

    sleep 2
done

위 코드에서는 .json 을 사용하여 JSON 문서를 생성합니다 jq. 문서에는 키가 있는 JSON 개체가 포함됩니다 WAL-VSX-02. 키 값은 --args명령 끝에 나열된 문자열을 요소로 포함하는 배열이 됩니다.

JSON 객체가 파이프 curl로 연결되어 --json @-.

각 반복에 게시된 JSON을 보려면 tee및 사이에 새 파이프라인 단계를 삽입하세요.jqcurl

귀하의 질문에서 볼 수 있는 데이터를 고려하면 다음과 같은 JSON 문서가 생성되어 게시됩니다.

{
  "WAL-VSX-02": [
    "12:53:17",
    "8fwk3_dev\n2fwk0_dev",
    "72\n43\n172\n28021\n8261\n14015\n325\n24\n524"
  ]
}

-c(그러나 우리가 사용한 옵션 때문에 한 줄에 있습니다 jq.)

조금 더 노력하면 이러한 여러 줄 문자열을 별도의 배열로 게시할 수 있습니다. 주어진 문자열을 새 줄로 분할하려면 약간 수정된 표현식을 사용하십시오 jq(첫 번째 문자열 제외).

jq -cn \
    '{ "WAL-VSX-02": ( $ARGS.positional | .[1:] |= map(split("\n")) ) }' \
    --args "$now" "$fwk" "$con"

이는 다음과 같은 결과를 생성합니다.

{
   "WAL-VSX-02": [
      "12:53:17",
      [ "8fwk3_dev", "2fwk0_dev" ],
      [ "72", "43", "172", "28021", "8261", "14015", "325", "24", "524" ]
   ]
}

관련 정보