无法在Bash

时间:2018-04-11 03:59:13

标签: linux bash shell awk sed

我有一个test.csv文件,如下所示

LOC,IP,D1,D2
abc1,10.13|10.12|10.13|10.14|10.15|10.16,10.11.1.1,11.1.1.23
abc2,12.11|10.15|10.116|10.127|10.110,11.110.8.25,11.11.5.3
abc3,13.21|13.2,10.1.4.50,10.2.7.3

我想在目标服务器上计算Ipaddress,然后检查ipaddress是否与test.csv文件中的值匹配。如果匹配,那么我想将check_funcpass values of D1 and D2称为该函数。

到目前为止,我可以使用以下命令

计算ipaddress
host=`uname -n'`
ip_addr=`host $host | awk '{print $NF}'`

现在,我想做类似下面的事情:

case $ip_addr in
      10.11|10.12|10.13|10.14|10.15|10.16)
             check_func "10.11.1.1" "11.1.1.23"

我编写了以下脚本,但没有给出正确的结果。我总是得到输出Unknown.

#! /bin/bash
shopt -s extglob
IFS_backup=$IFS
IFS=,
while read -r column1 column2 column3 column4 ; do
   shopt -s extglob
   case "$ip_addr" in
      @($column2)) check_func "$column3" "$column4" ;;
      *) echo Unknown. ;;
   esac
done < file.csv

2 个答案:

答案 0 :(得分:1)

全球比赛需要准确。前缀或子字符串匹配不会触发case子句。

所以你可能想要

WebDriverException: chrome not reachable
  (Session info: chrome=65.0.3325.181)
  (Driver info: chromedriver=2.35.528161 (5b82f2d2aae0ca24b877009200ced9065a772e73),platform=Windows NT 10.0.16299 x86_64)

有效地接受任何替代方案的前缀匹配。

顺便说一下,为@($column2)*) check_func "$column3" "$column4" ;; 语句设置IFS的更简洁方法是

read

这只是为while IFS=, read -r column1 column2 column3 column4 ; do 命令的环境设置IFS,因此您不必担心它会影响脚本的其余部分。

答案 1 :(得分:1)

尝试这样的事情:

host=$(uname -n)
awk -F, -v ip_addr="$(host "$host")" '
    BEGIN { sub(/.*[[:space:]]/,"",ip_addr) }
    { gsub(/\./,"[.]",$2) }
    ip_addr ~ $2 { print $3, $4; f=1 }
    END { if (!f) print "Unknown" | "cat>&2" }
' file.csv |
xargs -n 2 check_func

当然未经测试,因为您没有提供一套完整的样本输入/输出,我们可以对其进行测试,但希望它足够接近,如果它不完全正确,您可以解决。< / p>