我有一个带有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"
但需要它们(变量)两者都不同。
答案 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
。
如果您想使用外部工具(grep
或cut
)从输入文件中获取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)
虽然您可以将IP
和Port
读入单独的变量,但您也可以简单地读取整行,然后使用参数扩展和子字符串删除进行解析IP
和Port
分为不同的变量。
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
如果您还有其他问题,请与我们联系。