如果这是一个基本/愚蠢的问题,很抱歉。我没有shell脚本方面的经验,但我热衷于学习和开发。
我想创建一个脚本,读取文件,从一行提取IP地址,从另一行提取端口号,并将它们发送到一个变量,这样我就可以telnet了。
我的文件看起来有点像这样;
Server_1_ip=192.168.1.1
Server_2_ip=192.168.1.2
Server_port=7777
我只想获取server_1的IP还有港口。
我现在拥有的是;
Cat file.txt | while read line; do
my_ip="(grep -oE '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' <<< "$line")"
echo "$my_ip"
done < file.txt
这是有效的,但我如何指定server_1_ip
?
接下来,我做了同样的事情来找到端口,但不知何故,端口没有显示,而是显示";服务器端口";而不是后面的数字
我需要搜索两次还是可以合并搜索?为什么它将IP传递给变量而不传递给端口?
非常感谢您的意见。
Awk可能更适合:
awk -F"=" '$1=="Server_1_ip"{sip=$2}$1=="Server_port"{sport=$2}END{print sip, sport}' yourfile
这个awk说:
- 将每一行拆分为用等号分隔的列:
-F"="
- 如果第一列具有字符串
"Server_1_ip"
,则将第二列中的值存储到awk变量sip
:$1=="Server_1_ip"{sip=$2}
- 如果第一列为字符串
"Server_port"
,则将第二列中的值存储到awk变量sport
:$1=="Server_port"{sport=$2}
- 处理完整个文件后,打印出两个变量中的值:
END{print sip, sport}
您可以执行以下操作:
#!/bin/bash
while IFS='=' read key value; do
case "$key" in
Server_1_ip) target_ip="$value";;
Server_port) target_port="$value";;
esac
done < input
几乎可以肯定的是,不是合适的解决方案,因为它需要静态定义字符串Server_1_ip
,但还不完全清楚你想做什么。你可以eval
这些行,但这是有风险的。
确定要匹配的主机名的确切方式将极大地影响所需的解决方案。也许你只是想要这样的东西:
#!/bin/bash
target_host="${1-Server_1_ip}"
while IFS='=' read key value; do
case "$key" in
$target_host) target_ip="$value";;
Server_port) target_port="$value";;
esac
done < input
这里有一个sed
变体:
sed -n -e'/Server_1_ip=(.*)/{s//1/;h}; /Server_port=([0-9]*)/{s// 1/;H;g;s/n//p;q}' inputfile
- CCD_ 13停止正常输出
- 应用
-e commands
- 首先找到目标服务器,即
Server_1_ip=
,它有一个子表达式来记住该值(假设其IPv4格式良好(。应用一个命令块,用保存的子表达式替换模式空间(也称为当前行(,然后将模式空间复制到保持缓冲区;结束命令块 - 继续寻找端口线路。应用命令块,删除留下端口号的前缀将端口附加到保持缓冲区(所以现在
IP newline port
处于保持状态(;将所述保持缓冲区复制回模式空间;删除换行符并打印结果;退出
- 首先找到目标服务器,即
注意:GNU和BSDsed
可能会有所不同,尤其是在尝试连接行时,例如s/n//
。