如何将ip和端口号作为两个不同的变量

时间:2018-02-01 20:14:05

标签: bash grep

我有一个带有ips的txt文件和这样的端口:

std::string::find()

如何从中获取变量? 192.168.1.1:3389 192.168.1.2:5241 192.168.1.3:3310 192.168.1.4:445 $IP

其中

$port ...和IP=192.168.1.1

没有PORT=4344字符。

我的目标是:

echo : "$IP" 但需要它们(变量)两者都不同。

2 个答案:

答案 0 :(得分:3)

您可以使用内部字段分隔符来分割read命令的输入:

$ while IFS=: read -r ip port; do printf 'IP=%s, port=%s\n' "$ip" "$port"; done < file.txt
IP=192.168.1.1, port=3389
IP=192.168.1.2, port=5241
IP=192.168.1.3, port=3310
IP=192.168.1.4, port=445

在此用法中,$IFS仅针对read的召唤而非全局设置。

请注意,这与POSIX兼容,因此它可以在/bin/sh和其他shell中使用,而不仅仅是bash

如果您想使用外部工具(grepcut)从输入文件中获取JUST IP,您可以使用:

$ grep -o -E '^[^:]+' file.txt

$ cut -d: -f1 file.txt

或类似地,只是端口:

$ grep -o -E '[^:]+$' file.txt

$ cut -d: -f2 file.txt

但是如果你想要成对的,用shell命令分开处理每一对,grep不足以完成工作,因为它没有任何“字段”的概念。

答案 1 :(得分:1)

虽然您可以将IPPort读入单独的变量,但您也可以简单地读取整行,然后使用参数扩展和子字符串删除进行解析IPPort分为不同的变量。

Bash提供了许多内置的参数扩展,这里有两个相关的:

从'左'中删除子字符串

${var#substring}   trim 1st occurrence of substring from the left
${var##substring}  trim to last occurrence of substring from the left

从'右'中删除子字符串

${var%substring}   trim 1st occurrence of substring from the right
${var%%substring}  trim to last occurrence of substring from the right

substring可以包含通配符(globs)'*''?',以分别匹配零个或多个匹配项和任何单个字符。

适用于您的情况:

#!/bin/bash

[ -r "$1" ] || {  ## validate 1st argument is readable file
    printf "error: insufficient input.\nusage: %s filename\n" "${0##*/}"
    exit 1
}

while read -r line || [ -n "$line" ]; do  ## read each line into line
    ip="${line%:*}"                       ## separate IP into ip
    port="${line#*:}"                     ## separate Port into port
    ## validate both ip and port oare non-empty and output
    [ -n "$ip" ] && [ -n "$port" ] && echo "IP: $ip  Port: $port"
done < "$1"

示例使用/输出

$ bash ipport.sh ips.txt
IP: 192.168.1.1  Port: 3389
IP: 192.168.1.2  Port: 5241
IP: 192.168.1.3  Port: 3310
IP: 192.168.1.4  Port: 445

修改每条评论更新输入数据

如果您的数据是:

109.104.213.202:4443 Dobrich Bulgaria 202.213.104.109.bergon.net

然后你只需要添加一个额外的子串删除。请注意在您想要的IP:Port组合之后第一个空格是如何出现的?从右到右修剪''''(空格),例如

    line="${line%% *}"                    ## trim to last space from right
    ip="${line%:*}"                       ## separate IP into ip
    port="${line#*:}"                     ## separate Port into port

如果您还有其他问题,请与我们联系。