web-dev-qa-db-ja.com

シェルスクリプトを使用して文字列の一部を取得する

私は1つの文字列を持っています

/ip/192.168.0.1/port/8080/

ポートとIPを含む2つの個別の変数を取得したい

お気に入り。 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/\(.*\)/' 

しかし、それはポートを与えません..ポートを取得する方法も。

4
Straw Hat

Awkを使用できます。

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

入力ファイルまたは1行ずつ。

3
Isaac

次のように、単純にcutを使用できます。

cut -d '/' -f 3,5

例:

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

これは区切り文字/でカットされ、3番目と5番目のフィールドを出力します。

またはあなたが望むかもしれません:

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

配列を使用する別の純粋な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
$ 

この方法は、対象のフィールドに空白が含まれている場合でも機能するという点で、この回答の他の2つよりも一般的である可能性があることに注意してください。


または、位置パラメータを使用します。

$ 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
$ 
4
Digital Trauma
expr /ip/192.168.0.1/port/8080/ : '.*/port/\(.*\)/'

.*は、/portの前の文字列の最初の部分に一致します

3
Uwe

bash

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

これは別の方法です

$ cut -d '/' -f 3,5 <<< "/ip/192.168.0.1/port/8080/"|tr -s '/' ' '
192.168.0.1 8080
0
Kannan Mohan