否则,如果条件不适用于awk

否则,如果条件不适用于awk,awk,conditional-statements,Awk,Conditional Statements,ping 8.8.8.8-t5-c1 | awk'{if(/Time.*/)打印$1,$2;else if(NR==1)打印“from:$3”} 当我使用这一行时,else if不起作用,它基本上从和ip打印,不管首先是什么,甚至在if条件之前。 我希望它只在TTL足以到达目标时(或者在没有超出生存时间的消息时)打印它 这个命令基本上是我写的traceroute 我不知道为什么,否则如果条件不起作用,我希望得到帮助 整个bash脚本: #! /bin/bash read -p 'IP: ' I

ping 8.8.8.8-t5-c1 | awk'{if(/Time.*/)打印$1,$2;else if(NR==1)打印“from:$3”}

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

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

我不知道为什么,否则如果条件不起作用,我希望得到帮助

整个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

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

在下面的几行中,NR再也不会是1,因此只有当该行与
时间匹配时,才会得到输出

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

awk '(NR==1){f=$3}(/Time/){print$1,$2;p=1}END{if(!p)print f}'
f
用于记住第一行的IP,
p
是指示我们是否打印任何内容的标志。

尝试:

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

你到底得到了什么样的输出?您希望得到什么样的输出?我得到的输出是:从(8.8.8.8)到10.250.99.2我希望从10.250.99.2得到,因为它是唯一匹配IF语句的部分。您可以用
ping
的输出更新您的问题吗?添加了没有awk的ping输出。据我所知,这无助于我们查看整个bash脚本。你只需要发布a)awk
的输入(这恰好是ping命令的输出),b)你从输入中得到的输出,c)你想要的输出,显然除了awk命令及其参数之外。哦,这是有意义的。不知道awk每一条线都是分开运行的。有没有办法像通缉令一样正确地打印出来?@benshalev:检查更新情况。@Pierreflançois在我的问题下的评论中发布了通缉令的输出,与ping输出等相同。。choroba在更新中发布的内容非常感谢您的帮助!我只是明白你想要什么。您应该发布两个输入及其相应的输出,我们应该理解您希望使用
else
子句的行为。与if和else if的输出相同。@benshalev:问题是我们几乎猜不到您真正想要的输出。见我在你的问题下的评论。如果您澄清这一点,发布您想要的给定输入的确切输出,我们将更好地帮助您。