쉘 스크립트를 사용하여 문자열의 일부 가져오기

쉘 스크립트를 사용하여 문자열의 일부 가져오기

나는 밧줄을 가지고있다

/ip/192.168.0.1/port/8080/

포트와 IP를 포함하는 두 개의 독립 변수를 얻고 싶습니다.

좋다. 192.168.0.1그리고8080

내가 아는 한 /ip/ 및 /port/는 항상 거기에 있으며 내가 얻는 IP는 다음과 같습니다.

expr /ip/192.168.0.1/port/8080/ : '/ip/\(.*\)/port/' 

이것은 출력됩니다192.168.0.1 포트를 얻는 방법을 몰라 다음과 같은 명령을 시도했습니다.

expr /ip/192.168.0.1/port/8080/ : '/port/\(.*\)/' 

하지만 포트를 제공하지 않습니다. 포트를 얻는 방법.

답변1

당신은 단순히 사용할 수 있습니다cut다음과 같이:

cut -d '/' -f 3,5

예:

$ echo '/ip/192.168.0.1/port/8080/' | cut -d '/' -f 3,5
192.168.0.1/8080

이렇게 하면 구분 기호를 사용하여 /세 번째와 다섯 번째 필드를 잘라내어 인쇄합니다 .

또는 다음을 원할 수도 있습니다.

$ echo ip=`cut -d '/' -f 3 input_file` port=`cut -d '/' -f 5 input_file`
ip=192.168.0.1 port=8080

답변2

배열을 사용하는 또 다른 순수한 bash 방법:

$ s="/ip/192.168.0.1/port/8080/"        # initial string
$ a=(${s//// })                         # substitute / with " " and make array
$ echo ${a[1]}                          # Array index 1 (zero-based indexing)
192.168.0.1
$ echo ${a[3]}                          # Array index 3 (zero-based indexing)
8080
$ 

또는 위와 유사하지만 매개변수 확장 대신 IFS를 사용하여 문자열을 분할합니다.

$ OLDIFS="$IFS"                         # save IFS
$ IFS="/"                               # temporarily set IFS 
$ a=($s)                                # make array from string, splitting on "/"
$ IFS="$OLDIFS"                         # restore IFS
$ echo "${a[2]}"                        # Array index 2
192.168.0.1
$ echo "${a[4]}"                        # Array index 4
8080
$ 

이 방법은 아마도 이 답변의 다른 두 가지 방법보다 더 일반적일 것입니다. 관심 필드에 공백이 포함된 경우에도 여전히 작동하기 때문입니다.


또는 위치 매개변수를 사용하세요.

$ s="/ip/192.168.0.1/port/8080/"        # initial string
$ set -- ${s//// }                      # substitute / with " " and assign params
$ echo $2                               # Param 2
192.168.0.1
$ echo $4                               # Param 4
8080
$ 

답변3

awk를 사용할 수 있습니다.

awk -F\/ '{print $2"="$3, $4"="$5}' input_file

입력 파일을 사용하거나 한 줄씩 진행하세요.

답변4

그리고bash

s=/ip/192.168.0.1/port/8080/
IFS=/ read -r _ _ ip _ port <<<"$s"
echo "$ip"
192.168.0.1
echo "$port"
8080

관련 정보