如何在.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
打印插入变量l
和avg
内容的文本,并将此输出重定向到附加到其内容的文件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