구성 파일에서 두 개의 값을 추출하여 새 파일에 쓰려고 합니다. 어려운 부분은 새 파일의 이름이 입력 파일의 값 중 하나에 의해 결정되기를 원한다는 것입니다.
제가 추출하려는 값은 "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/
바꾸세요 . 빈 문자열 이면 효과적으로 삭제됩니다. 문자열 내의 작은따옴표를 처리하기 위해 작은따옴표에서 큰따옴표로 전환했으며, 와일드카드를 사용하여 더 복잡한 문자열을 일치시키고 명령을 세미콜론과 결합할 수 있습니다.pattern
replacement
match
replacement
* .
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