변수를 읽는 데 도움이 필요합니다

변수를 읽는 데 도움이 필요합니다

저는 현재 우분투에 익숙해지고 있습니다. 여러 bash 파일을 다루는 개인 프로젝트가 있습니다.

config.txt다음 문자열이 포함된 파일이 있습니다.

hostip="192.168.1.2"
pname="My Office"
pid="01-001"

hostip내 질문은 file 의 변수가 필요한 bash 파일이 있는 경우 문자열을 config.txt어떻게 추출합니까 192.168.1.2(큰따옴표는 출력에서 ​​제거해야 함)입니다.

답변1

awk이를 달성하기 위해 이를 사용할 수 있습니다 . 예를 들면 다음과 같습니다.

$ awk -F'"' '/hostip/ {print $2}' host.txt
192.168.1.2
  • -F옵션은 필드 구분 기호를 결정합니다.
  • /hostip/검색 문자열 결정
  • {print $2}인쇄할 필드를 결정합니다 .

이렇게 하면 파일에서 문자열을 가져와 bash 스크립트 내부의 변수에 넣을 수 있습니다. 예를 들면 다음과 같습니다.

hostip=$(awk -F'"' '/hostip/ {print $2}' host.txt)

답변2

사용sed

sed -n "s/hostip=\([^ ]*.*\)/\1/p" config.txt

그러나 config.txt 선언에 공백이 포함된 경우(예: ) hostip = 192.168.1.2:

sed -n "s/hostip *= *\([^ ]*.*\)/\1/p" config.txt

마지막으로, 삶을 더 쉽게 만들기 위해 함수나 래퍼 스크립트를 만듭니다.

get_value() { 
    sed -n "s/$1 *= *\([^ ]*.*\)/\1/p" $2
}

get_value hostip config.txt
# prints 192.168.1.2
get_value pname config.txt
# prints My Office

hostip=$(get_value hostip config.txt)

답변3

Raku(이전 Perl6) 사용

~$ raku -ne 'put $/ if m/ <?after  hostip\= > \" <([\d**1..3 \.]**3 \d**1..3)> \" /;' config1.txt
192.168.1.2

명령 -ne줄 플래그는 Raku에게 입력을 한 줄씩 확인하라고 지시합니다. 위의 코드는 다음과 같이 작성된 긍정적인 0 너비 LookBehind 어설션을 사용합니다 <?after … >. 정규식은 마침표로 구분된 1~3자리 숫자 그룹의 4개 숫자 그룹과 일치하는 항목을 찾습니다. 이 <( … )>관용구는 Raku에게 각 외부 일치 항목을 제거하고 내부 일치 항목을 $/반환된 일치 변수에 로드하도록 지시합니다.

HTH.

https://raku.org

관련 정보