점퍼가 있는 CSV 파일의 프로젝트에서 AWK 실행 운영 체제 명령

점퍼가 있는 CSV 파일의 프로젝트에서 AWK 실행 운영 체제 명령

다음과 같은 CSV 파일이 있습니다.

keyuat,carsim,logs-keyuat-carsim
lowuat,carsimserver,logs-lowuat-carsimserver
utils,dash,logs-utils-dash
utils,lifecycle,logs-utils-lifecycle
utils,lifecycle-nodejs,logs-utils-lifecycle-nodejs
workshop,cashier,logs-workshop-cashier
workshop,jfrog-dotnet,logs-workshop-jfrog-dotnet
workshop,labelsengine,logs-workshop-labelsengine

이 CSV 파일을 기반으로 동시에 실행해야 하는 두 가지 명령을 실행하려고 합니다.

oc project $1 
oc patch dc $2 -p '{"metadata":{"labels":{"logentries":"$3"}}}'

위의 실제 예를 사용하면 명령은 다음과 같습니다.

oc project keyuat 
oc patch dc carsim -p '{"metadata":{"labels":{"logentries":"logs-keyuat-carsim"}}}'

awk를 사용하려고 시도했지만 볼 수 없는 특수 문자 또는 /r 유효하지 않은 문자 관련 문제가 계속 발견됩니다. system사용 하지 않고 print대신 줄 끝에 추가되는 대신 일부 문자가 줄 시작 부분에 겹쳐지는 경우:

 awk -F , '{ cmd="oc project " $1 "\;" "\n" "oc patch dc " $2 " \-p '\''\{\"metadata\"\:\{\"labels\"\:\{\"logentries\"\:\"" $3"\""; print(cmd) }' ./csv/labels.csv
 
"}}}oject keyuat; oc patch dc carsim -p '{"metadata":{"labels":{"logentries":"logs-keyuat-carsim
"}}}oject lowuat; oc patch dc carsimserver -p '{"metadata":{"labels":{"logentries":"logs-keyuat-carsimserver
 "}}}oject utils; oc patch dc dash -p '{"metadata":{"labels":{"logentries":"logs-utils-dash


awk -F , '{ cmd="oc project " $1 "\;" "oc patch dc " $2 " -p '\''\{\"metadata\"\:\{\"labels\"\:\{\"logentries\"\:\"" $3 "\"\}\}\}'\''"; system(cmd) }' ./csv/labels.csv
awk: cmd. line:1: warning: escape sequence `\;' treated as plain `;'
awk: cmd. line:1: warning: escape sequence `\{' treated as plain `{'
awk: cmd. line:1: warning: escape sequence `\:' treated as plain `:'
awk: cmd. line:1: warning: escape sequence `\}' treated as plain `}'
Already on project "keyuat" on server "https://test-ocp.exampleusage.eu:443".
Error from server (BadRequest): invalid character '\r' in string literal
Already on project "lowuat" on server "https://test-ocp.exampleusage.eu:443".
Error from server (BadRequest): invalid character '\r' in string literal
Now using project "utils" on server "https://test-ocp.exampleusage.eu:443".
Error from server (BadRequest): invalid character '\r' in string literal

이 스크립트를 어떻게 수정할 수 있나요?

답변1

나는 사용할 것이다

json=$(jq -n -c --arg le "$3" '{metadata: {labels: {logentries: $le}}}')

# no `$` here, I'm building arrays
cmd1=(oc project "$1")
cmd2=(oc patch dc "$2" -p "$json")

# now, execute the commands
"${cmd1[@]}"
"${cmd2[@]}"

명령 내용을 확인하려면 다음을 수행하십시오.

$ declare -p cmd1 cmd2
declare -a cmd1=([0]="oc" [1]="project" [2]="keyuat")
declare -a cmd2=([0]="oc" [1]="patch" [2]="dc" [3]="carsin" [4]="-p" [5]="{\"metadata\":{\"labels\":{\"logentries\":\"logs-keyuat-carsim\"}}}")

답변2

awk에서는 작은따옴표를 쉽게 인쇄할 수 있습니다: \047

시도해 볼 수 있습니다(여기에 입력하는 중이므로 지금은 테스트할 수 없습니다...정확하길 바랍니다!)

# if needed: take out "^M" from the input file
tr -d '\015' <inputfile.csv >inputfile_sanitized.csv

# then parse it with:
awk -F',' '
  { cmd1="oc project " $1 
    cmd2="oc patch dc " $2 " -p \047{\"metadata\":{\"labels\":{\"logentries\":\"" $3 "\"}}}\047"
    ## once sure: you can here do: system(cmd1 " ; " cmd2); 
    print cmd1 " ; " cmd2
  }' inputfile_sanitized.csv

답변3

입력 파일이 Unix 텍스트 파일이고 관련된 모든 필드가 "양호"하다고 가정하면(삽입된 쉼표, 따옴표 또는 줄 바꿈이 없고 특수 JSON 인코딩이나 셸에 추가 따옴표가 필요하지 않음) 다음을 수행할 수 있습니다. 간단한 쉘 루프를 사용하여:

while IFS=, read -r project dc logentries; do
        cat <<END_CMDS
oc project $project
oc patch dc $dc -p '{"metadata":{"labels":{"logentries":"$logentries"}}}'
END_CMDS
done <file | sh -s

그러면 명령 스트림이 생성됩니다.

oc project keyuat
oc patch dc carsim -p '{"metadata":{"labels":{"logentries":"logs-keyuat-carsim"}}}'
oc project lowuat
oc patch dc carsimserver -p '{"metadata":{"labels":{"logentries":"logs-lowuat-carsimserver"}}}'

(등등)... sh -s실행 단계로 전달됩니다.


다시 말하지만, 오늘날 사용되는 도구는 실제로 CSV를 구문 분석하는 방법, 셸의 문자열을 인용하는 방법 및 JSON을 만드는 방법을 알고 있습니다.

mlr --icsv -N --ojson cat file | 
jq -r '
    @sh "oc project \(."1")",
    @sh "oc patch dc \(."2") \({metadata:{labels:{logentries:."3"}}}|tostring)"' |
sh -s

여기서는 mlr(Miller)를 사용하여 입력을 CSV에서 기본 JSON 문서로 변환합니다. 그런 다음 JSON 문서는 JSON 프로세서에 의해 구문 분석되며 jq, 이 프로세서는 인용된 문자열과 적절한 형식의 JSON을 포함하는 셸 코드를 생성합니다. 이전과 같이 출력을 실행으로 보냅니다 sh -s.

이와 같은 입력 라인의 경우

"The ""Project""","A study, in many parts",It'll be fine

그러면 두 개의 명령이 생성되고 실행됩니다.

oc project 'The "Project"'
oc patch dc 'A study, in many parts' '{"metadata":{"labels":{"logentries":"It'\''ll be fine"}}}'

관련 정보