如何在.txt文件中的单独行上读取URL并ping每个URL

我有一个包含5个url的.txt文件。 我想逐行阅读,并为每个站点执行4个ping请求,并提取时间。 我写的代码如下,但它不起作用。

任何人都可以给我一个暗示吗?

 #!/bin/bash cat /home/akis/Desktop/sites.txt declare -i var=1 while read -r line do while $var  $var.txt | awk '{ print $8 }'  $var2.txt | tr '=' '\t'  $var2.txt done var=$((var+1)) done 

这和Sergiy的回答来自带有URL的循环文本文件并在每个文件上执行ping 。

假设文件urls位于当前目录中并且包含您的URL,每行一个:

 #!/bin/bash while IFS='' read -rl || [ -n "$l" ]; do avg=$(ping -q -w 10 "$l" | sed '$!d;s_.*=[^/]*/\([^/]*\)/.*_\1_') echo "Average respond time for $l: $avg ms" >> avg_time done < "urls" 

示例运行

上面的脚本在这里命名为avg

 $ cat urls askubuntu.com unix.stackexchange.com stackoverflow.com $ ./avg $ cat avg_time Average respond time for askubuntu.com: 37.742 ms Average respond time for unix.stackexchange.com: 35.966 ms Average respond time for stackoverflow.com: 38.982 ms 

说明

  • #!/bin/bash
    这个所谓的shebang定义了你的脚本必须以哪个shell开头,这里是bash
  • while IFS='' read -rl || [ -n "$l" ]; do stuff ; done < "urls"
    逐行read名为urls的文件,将当前处理的行的内容分配给变量l并使用它进行处理
  • ping -q -w 10 "$l" (= ping -qw10 "$l"
    使用变量l的内容作为参数调用ping ,并选择-q uiet(我们不需要的输出少)和-w 10 (以秒为单位的超时),以便当前处理的URL被准确地按住10秒钟 - 你可以根据您的需要调整此值,并为列表指定其他选项(请参阅man ping
  • avg=$(ping … | sed …)
    ping的输出传递给sed ,这会减少平均响应时间并将此值保存在变量avg

    • sed '$!d;s_.*=[^/]*/\([^/]*\)/.*_\1_'
    • sed '$!d
      不要( !d最后一行( $ ),但整个rest
    • sed 's/a/b/'
      如果有用sed 's_a_b_'话,也可以写成例如sed 's_a_b_' ,这样我们就不需要在字符串中转义字面斜杠字符了
      • .* - 拿走一切
      • =/ - 文字“=”和“/”
      • [^/]* - 取一些不是( ^ )的斜杠
      • \([^/]*\) - 将不是( ^ )的所有内容删除并将其保存在一个组中
      • \1 - 第一组用\(…\)保存之前
    • 使用awk -F/ '/^rtt/{print$5}'也可以完成同样的工作:
      • -F/ - 定义/作为字段分隔符
      • /^rtt/{…} - 用“rtt”选择行开头( ^ )并用它做
      • print$5 - 仅print字段号。 5
  • echo "Average respond time for $l: $avg ms" >> avg_time
    打印插入变量lavg内容的文本,并将此输出重定向到附加到其内容的文件avg_time

对于一个简单的命令,如ping ,可以使用xargs 。 关于xargs的一个很酷的事情是它有--arg-file选项,它允许你指定xargs将用于为你试图运行的命令提供位置参数的文件; 在您的情况下,这将是文本文件中每行一个站点。

特别是你想要的命令是这样的:

 xargs -I% --arg-file=./input.txt ping -c 4 % 
  • -I允许我们为每个参数选择占位符, xargs将在内部使用
  • --arg-file是位置参数来自的文件; 请注意,我们使用./来表示该文件位于当前工作目录中
  • ping -c 4将尝试使用4个数据包ping来自input.txt每个站点

请注意,我们还可以使用-q选项进行ping ,以防止为每个接收/传输的数据包打印一行,只输出统计信息。 从那里我们可以使用awk或任何其他文本处理实用程序进一步清理输出(请记住,输出将通过管道进行缓冲,并等待ping实际完成并输出统计信息,因此将显示在屏幕上a有点慢):

 $ xargs -I% --arg-file=./input.txt ping -c 4 % -q | awk '/^---/||/avg/' --- askubuntu.com ping statistics --- rtt min/avg/max/mdev = 49.677/73.403/94.312/19.276 ms --- unix.stackexchange.com ping statistics --- rtt min/avg/max/mdev = 40.015/59.099/115.545/32.590 ms --- stackoverflow.com ping statistics --- rtt min/avg/max/mdev = 40.130/40.878/42.685/1.056 ms $ xargs -I% --arg-file=./input.txt ping -c 4 % -q | awk -F'[ /]' '/^---/{print $2};/avg/{print $8}' askubuntu.com 39.809 unix.stackexchange.com 189.557 stackoverflow.com 161.974