我有一根绳子作为
/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