使用 shell 脚本获取字符串的一部分

使用 shell 脚本获取字符串的一部分

我有一根绳子作为

/ip/192.168.0.1/port/8080/

我想获得两个包含端口和 IP 的独立变量

喜欢。192.168.0.18080

据我所知 /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

相关内容