파일에서 데이터를 추출하고 값 중 하나를 기반으로 파일 이름을 구성하는 방법

파일에서 데이터를 추출하고 값 중 하나를 기반으로 파일 이름을 구성하는 방법

구성 파일에서 두 개의 값을 추출하여 새 파일에 쓰려고 합니다. 어려운 부분은 새 파일의 이름이 입력 파일의 값 중 하나에 의해 결정되기를 원한다는 것입니다.

제가 추출하려는 값은 "Build_Version"과 Docker 이름의 4자리 약어("docker_Name")입니다. 예를 들어 파일에 가 표시되면 docker_Name='bcbs_pr-app-01'"bcbs"만 필요합니다. .bcbs_build.txt

다음은 로그 파일에서 발췌한 내용입니다.

nonSSL_port=80  # FOR STAGING 
Build_Type=prod 
Build_Version=9.0.00.01_134143 
docker_Name='bcbs-pr-app-01'

원하는 파일 출력은 다음과 같습니다.

bcbs
9.0.00.01_134143 

sed내가 원하는 값을 추출하는 명령어를 알아냈어요

sed -n -e '/Build_Version=/p' -e '/docker_Name=/p' environment-info.conf > build_version.txt

하지만 이렇게 하면 Build_Version=합계 줄이 완전히 추출되는 반면 Build_Version 및 docker name 값만 필요합니다. docker_Name=4자로 된 Docker 이름 약어(bcbs)를 사용하여 파일 이름을 지정하는 방법을 알아내야 합니다.

답변1

파일은 sh구문처럼 보입니다. 따라서 해당 파일이 실제로 sh스크립트에 포함하려는 구성 파일 인 경우 다음을 수행하세요.

. ./environment-info.conf &&
  printf '%s\n' "${docker_Name%%-*}" "$Build_Version" > "${docker_Name%%-*}_build.txt"

답변2

1) sed를 a) 첫 번째 작은따옴표 제거 docker_Name, b) 제거 -pr-app-01'(마지막 작은따옴표 포함), c) <value>=부분 제거:

 sed -n "/Build_Version=/s/.*=//p;/docker_Name=/s/.*=//;s/'//;s/-.*//p"

where를 at ing 라인 으로 /match/s/pattern/replacement/바꾸세요 . 빈 문자열 이면 효과적으로 삭제됩니다. 문자열 내의 작은따옴표를 처리하기 위해 작은따옴표에서 큰따옴표로 전환했으며, 와일드카드를 사용하여 더 복잡한 문자열을 일치시키고 명령을 세미콜론과 결합할 수 있습니다.patternreplacementmatchreplacement* .sed

2) BASH두 결과를 배열로 읽습니다.

values=( $( sed -n "/Build_Version=/s/.*=//p;/docker_Name=/s/.*=//;s/'//;s/-.*//p" file ) )

위치 array=( value1 value2 value3 )$(do this command)

3) 우리는 이 배열을 우리의 목적에 맞게 사용합니다. 카운터는 다음에서 시작됩니다 0.

echo ${values[1]} > ${values[1]}
echo ${values[0]} >> ${values[1]}

배열 이름과 항목의 인덱스로 배열 항목의 주소를 지정합니다 ${array[intex]}.

답변3

꼭 이걸 사용해야 하나요 sed? grep그리고 perl필요한 것을 할 수 있습니다.

grep 'Build_Type\|docker_Name' environment-info.conf | perl -pe "s|docker_Name='(.*?)-.*|docker_Name=\1|" > build_version.txt

답변4

docker 이름의 네 글자를 사용하여 파일 이름을 지정하는 방법을 찾고 있습니다. 이는 File_Name이라는 변수에 4개의 문자를 할당하는 다음 명령을 사용하여 수행할 수 있습니다.

File_Name=`cat file | grep "docker_Name" | awk -F"'" '{print $2}' | awk -F'-' '{print $1}'`

위의 답변에서 언급했듯이 다음 명령은 docker_Name 및 build_version을 value라는 배열에 할당합니다.

values=($(sed -n "/docker_Name=/s/.*=//;s/'//;s/-.*//p;/Build_Version=/s/.*=//p" file))

원하는 방식으로 출력을 캡처하기 위해 역순으로 배열에 액세스합니다.

for i in 1 0; do echo ${values[$i]} >> $File_Name.txt; done

파일은 원하는 이름으로 준비되며 cat은 해당 내용을 표시합니다.

% cat bcbs.txt
bcbs
9.0.00.01_134143

관련 정보