나는 밧줄을 가지고있다
/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