obtém partes da string usando o shell script

4

Eu tenho uma string como

/ip/192.168.0.1/port/8080/

Eu quero pegar duas variáveis separadas que conterão porta e IP

como. 192.168.0.1 e 8080

como eu sei / ip / e / port / vai estar lá sempre eu tenho Ip da seguinte forma,

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

isto produzirá 192.168.0.1 só não sei como conseguir porta, Eu tentei comando semelhante como,

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

mas não dá porta .. como conseguir porta também.

    
por Straw Hat 31.10.2014 / 10:50

6 respostas

3

Você pode usar o awk:

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

com um arquivo de entrada ou apenas linha por linha.

    
por 31.10.2014 / 10:58
6

Você pode simplesmente usar cut da seguinte forma:

cut -d '/' -f 3,5

Exemplo:

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

Isso cortará com o delimitador / e imprime os campos 3 e 5.

Ou a seguir, você pode querer:

$ echo ip='cut -d '/' -f 3 input_file' port='cut -d '/' -f 5 input_file'
ip=192.168.0.1 port=8080
    
por 31.10.2014 / 11:42
4

Outro caminho bash puro usando matrizes:

$ 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
$ 

Ou semelhante ao acima, mas usando o IFS em vez da expansão de parâmetro para dividir a string:

$ 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
$ 

Observe que esse método é potencialmente mais geral do que os outros dois nesta resposta, pois ainda deve funcionar se os campos de interesse contiverem espaço em branco.

Ou usando parâmetros posicionais:

$ 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
$ 
    
por 31.10.2014 / 17:26
3
expr /ip/192.168.0.1/port/8080/ : '.*/port/\(.*\)/'

.* corresponde à parte inicial da string antes de /port

    
por 31.10.2014 / 10:59
3

com bash

s=/ip/192.168.0.1/port/8080/
IFS=/ read -r _ _ ip _ port <<<"$s"
echo "$ip"
192.168.0.1
echo "$port"
8080
    
por 31.10.2014 / 16:45
0

Esta é outra maneira

$ cut -d '/' -f 3,5 <<< "/ip/192.168.0.1/port/8080/"|tr -s '/' ' '
192.168.0.1 8080
    
por 31.10.2014 / 18:32