【问题标题】:Shell script to parse Names Ip port and priority用于解析名称 IP 端口和优先级的 Shell 脚本
【发布时间】:2015-08-09 17:35:17
【问题描述】:

我有一个 bash 脚本,并在其中创建并执行一个 python 脚本,该脚本使用 lxml etree 解析一个巨大的 xml 文件以提取以下数据:

数据可能有多个服务器或只有一个或没有,每个服务器将有4个数据名称、ip、端口和优先级值:

name1
1.1.1.1
port#
priority 
name2
1.1.1.2
port#
priority 
name3
1.1.1.3
port#
priority 

我需要读取这个文件,并与文件中指定的 ip 和端口建立 ssh 连接。如果连接到第一个 IP 成功,我会“断开”,否则我会尝试第二个连接,依此类推...

我目前在脚本中定义了一个循环,其中有 2 个特定 IP 被硬设置为变量,如下所示:

echo -e "\n${YELLOW}Checking HOST SSH Connectivity.$NOCOLOR"
for HOST in $HOST1 $HOST2; do
  ERRno=0
  echo -e "${YELLOW}Attempting to connect to $HOST From $IP${NOCOLOR}"
  if cat < /dev/tcp/$HOST/22 </dev/null; then
   echo -e "\n${CYAN}Connection To $HOST Over Port 22 From ${YELLOW}$IP ${CYAN}Seem's Good. Starting SSH Session. ${YELLOW}To End SSH Session Hit CTRL-C.$NOCOLOR"
    if ! /usr/bin/ssh -c aes256-ctr -F "$SSHCONF" -p 22 "$HOST" "$CMD" ; then
     echo -e "${RED}Please Check Connectivity, SSH Session Ended.$NOCOLOR"
    fi
  else
    echo -e "${RED}Unable to connect to $HOST, Customer should make sure Port 22 Outbound is Allowed Through Firewall from $IP to $HOST.$NOCOLOR"
    ERRno=3
  fi
# If we had a good session (on the 1st server), break out, we are done
  [[ $ERRno -eq 0 ]] && break
  if [[ $HOST != $HOST1 ]]; then
    echo -e "${RED}No More Servers To Try. Unable To Establish Any SSH Session.$NOCOLOR"
    exit $ERRno
  else
    echo -e "${YELLOW}Trying Next Server...${NOCOLOR}"
  fi
done

但是,阅读长度可能不同的文件是我感到困惑的地方。

我怎样才能做到这一点? 我应该构建和排列和索引吗? 我应该做一个while读取循环吗?

无论哪种方式,请提供示例。

【问题讨论】:

  • 如果你已经在使用 Python,为什么不在 Python 中做这部分呢?
  • 脚本的其余部分是用 bash 编写的,而且它很大,我不想重写它......它只是更简单......
  • 好的,为什么不让 Python 程序创建一个 bash 脚本来获取源而不是数据文件。脚本可以展开循环,找到合适的主机后退出...
  • 这是个好主意,谢谢我可以试试。

标签: bash file loops line


【解决方案1】:

“我如何读取不确定的行数”的简单答案是 while 循环。

while read -r name && read -r address && read -r port && read -r priority; do
    : stuff
done <file

为了可用性和可读性,更常见的安排是将数据布置为每行一条记录,每个字段在一个单独的标记中(或者如果您的字段值具有多个标记,请使用专用的分隔符,例如作为逗号,这会使您的输入成为 CSV 文件)。

while read -r name address port priority; do
    : stuff
done <<'__HERE'
  name1 1.1.1.1  80 25
  name2 1.1.1.2 119  3
  name3 1.1.1.3 443 50
__HERE

要使用逗号作为分隔符,(本地)将 shell 变量 IFS 设置为逗号。

【讨论】:

  • 我认为这是最简单的解决方案 :) 非常感谢有一个大脑袋放屁。
猜你喜欢
  • 1970-01-01
  • 2015-03-07
  • 1970-01-01
  • 2013-01-06
  • 2012-01-29
  • 2013-05-06
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
相关资源
最近更新 更多