Shell脚本与grep断开



如果这是一个基本/愚蠢的问题,很抱歉。我没有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说:

  1. 将每一行拆分为用等号分隔的列:-F"="
  2. 如果第一列具有字符串"Server_1_ip",则将第二列中的值存储到awk变量sip:$1=="Server_1_ip"{sip=$2}
  3. 如果第一列为字符串"Server_port",则将第二列中的值存储到awk变量sport:$1=="Server_port"{sport=$2}
  4. 处理完整个文件后,打印出两个变量中的值: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//

相关内容

  • 没有找到相关文章

最新更新