【问题标题】:Else if conditional does not apply in awk否则,如果条件不适用于 awk
【发布时间】:2021-05-03 08:14:06
【问题描述】:

ping 8.8.8.8 -t 5 -c1 | awk '{if (/Time.*/) print $1,$2; else if (NR==1) print "from: " $3 " "}'

当我使用这一行时,else if 不起作用,它基本上从和 ip 打印,无论首先是什么,甚至在 if 条件之前。 我希望它仅在 TTL 足以达到目标时打印它(或者当没有涉及超过生存时间的消息时)

这个命令基本上是我写的traceroute。

我不知道为什么 else if 条件不起作用,我很想帮助。

整个 bash 脚本:

#! /bin/bash

read -p 'IP: ' IP
read -p 'Max hops: ' hops

for hop_num in $(seq 1 $hops)
do
        if [[ $IP =~ [0-9] ]];then
                echo "$hop_num " | tr -d '\n'
                ping $IP -t $hop_num -c1 | awk '{if (/Time.*/) print $1,$2; else if (NR==1) print "Dest: " $3 " "}'
            
        else
                echo "not matched"
        fi
done

不带 awk 过滤器的 Ping 输出:

PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
From 10.250.99.2 icmp_seq=1 Time to live exceeded

--- 8.8.8.8 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

【问题讨论】:

  • 你到底得到了什么输出?您希望得到什么输出?
  • 我得到的输出是:from (8.8.8.8) From 10.250.99.2 我希望只得到 From 10.250.99.2 因为它是唯一匹配 IF 语句的部分
  • 你能用ping的输出更新你的问题吗?
  • 添加了不带 awk 的 ping 输出。
  • 据我了解,查看整个 bash 脚本对我们没有帮助。您只需要发布 a)awk 的输入(恰好是 ping 命令的输出),b)您使用该输入获得的输出,以及 c)您想要的输出,显然除了 @ 987654327@ 命令及其参数。

标签: awk conditional-statements


【解决方案1】:

这是意料之中的。第一行与Time.* 不匹配,但 NR 为 1,因为它是第一行。因此,打印了 $3,恰好是 (8.8.8.8)

在以下几行中,NR 不再为 1,因此只有当该行匹配 Time.* 时,您才会得到输出。

要解决问题,请记住第一行的 IP,如果没有打印任何内容,请在最后打印。

awk '(NR==1){f=$3}(/Time/){print$1,$2;p=1}END{if(!p)print f}'

f 用于记住第一行的 IP,p 是告诉我们是否打印任何内容的标志。

【讨论】:

  • 哦,这很有道理。不知道 awk 分别运行每一行。有没有办法像想要的那样正确打印它?
  • @PierreFrançois 在我的问题下的评论中发布了想要的输出,与 ping 输出等相同。更新中发布的 choroba 内容有效,请您帮忙!
  • 我刚刚明白你想要什么。您应该已经发布了两个输入及其对应的输出,并且我们应该已经了解您想要使用 else 子句的行为。
【解决方案2】:

试试:

ping 8.8.8.8 -t 5 -c1 | awk '/Time/{print $1,$2}(NR==1){print "from: " $3 " "}

【讨论】:

  • 与 if 和 else if 的输出相同。
  • @benshalev:问题是我们很难猜出你真正想要的输出。在您的问题下查看我的评论。如果您澄清这一点,我们将为您提供更好的帮助,发布您想要的给定输入的确切输出。
猜你喜欢
  • 2016-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-27
  • 2021-11-27
  • 1970-01-01
相关资源
最近更新 更多