shell脚本实现取当前时间

本文介绍如何使用Shell脚本获取并格式化当前时间。包括四种不同格式的时间输出:原始格式、时间串格式、日期时间格式及日期格式。

shell脚本实现取当前时间

shell 实现获取当前时间,并进行格式转换的方法:

1)原格式输出

2018年 09月 30日 星期日 15:55:15 CST

time1=$(date)
echo $time1

 

2)时间串输出

20180930155515

1 #!bin/bash
2 time2=$(date "+%Y%m%d%H%M%S")
3 echo $time2

 

 3)2018-09-30 15:55:15

#!bin/bash
time3=$(date "+%Y-%m-%d %H:%M:%S")
echo $time3

4)2018.09.30

#!bin/bash
time4=$(date "+%Y.%m.%d")
echo $time4

注意

1、date后面有一个空格,shell对空格要求严格

2、变量赋值前后不要有空格

 

<think>我们使用shell脚本实现域名最优IP(PING的RTT时间最短)的方法。 思路: 1. 解析域名获所有IP地址(考虑IPv4即可,IPv6可选) 2. 对每个IP地址进行ping测试,获平均延迟(RTT) 3. 比较所有IP的延迟,选择最小的那个 注意点: - 域名可能对应多个IP(DNS轮询) - 需要处理ping命令在不同操作系统的输出差异(这里假设是Linux环境) - 考虑减少ping的次数(如每个IP只ping 2-4次)以加快速度 - 考虑超时处理(如某个IP不通则跳过) 步骤: 1. 使用`dig`或`nslookup`或`host`命令获域名的IP地址,这里使用`host`命令,输出简洁。 2. 遍历每个IP,使用ping命令(指定次数,如4次)并解析平均延迟。 3. 记录每个IP的延迟,最后比较得出最小延迟的IP。 在Linux中,ping命令的输出示例(英文): ``` PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. 64 bytes from 8.8.8.8: icmp_seq=1 ttl=118 time=12.3 ms ... (省略) --- 8.8.8.8 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3005ms rtt min/avg/max/mdev = 10.241/12.084/14.111/1.431 ms ``` 我们需要提的是`rtt`行中的`avg`值(即平均值)。注意,不同语言环境输出可能不同,我们这里假设为英文。 但是,我们注意到用户引用[1]中显示中文输出,所以我们要考虑两种可能: 中文:`rtt min/avg/max/mdev = 10.241/12.084/14.111/1.431 ms` 或者 中文:`最小/平均/最大 = 10.241/12.084/14.111 ms` 为了兼容,我们可以这样处理: 在ping统计结果行中,我们寻找`min/avg/max`或`最小/平均/最大`这样的关键词,然后提第二个数值(即平均值)。 另一种方法是使用`ping`命令的统计输出选项,但不同系统可能不一致。 这里我们采用:每个IP ping 4次,然后从输出的最后两行中提统计信息。 具体步骤: 1. 获域名对应的IP列表 2. 对每个IP执行ping命令,并解析出平均延迟(avg) 3. 如果没有收到回复,则跳过(延迟设为无穷大) 4. 比较所有IP的延迟,输出延迟最小的IP 由于我们是在shell脚本中处理,所以可以使用awk等工具进行文本处理。 脚本实现: 注意:我们使用`ping -c 4 IP`的方式,然后解析输出。 解析ping输出的平均延迟(兼容中英文): 在统计行中,如果有`rtt min/avg/max`或`min/avg/max`,我们第二个数字。 具体匹配:在包含`min/avg/max`的行中,以等号分割,然后第二个字段(即10.241/12.084/14.111/1.431),再以'/'分割第二个。 但是,注意中文输出可能没有rtt,如用户引用[1]中: `rtt min/avg/max/mdev = 37.196/37.196/37.196/0.000 ms` 或者另一种中文输出: `最小 = 10.241ms,平均 = 12.084ms,最大 = 14.111ms` 为了兼容性,我们可以这样处理: 在统计行中,我们寻找等号(或冒号)后面的数字,并且注意可能有多个等号,我们关注的是包含“min/avg/max”或“最小/平均/最大”的行。 有两种思路: 1. 使用`ping`命令后,通过`grep`和`awk`提平均延迟 2. 使用`ping`的`-q`参数(安静模式)减少输出,然后从统计行中提 这里我们使用第二种,因为`-q`参数在Linux下可用,它会减少输出,只显示统计行。 例如:`ping -c 4 -q 8.8.8.8` 输出: PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. --- 8.8.8.8 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3000ms rtt min/avg/max/mdev = 10.241/12.084/14.111/1.431 ms 这样,我们只需要最后两行,然后从最后一行提。 但是,注意:在不通的情况下,输出可能没有最后一行(只有传输情况)。所以我们需要判断接收包数。 我们使用以下命令获平均延迟: ping -c4 -q $ip | awk -F'/' '/^rtt / { print $5 }' 解释:以'/'分割,匹配以'rtt'开头的行(注意,在英文环境下,统计行以'rtt'开头;中文环境下,可能是中文?) 在中文环境下,输出可能是: rtt min/avg/max/mdev = 10.241/12.084/14.111/1.431 ms 或者 最小/平均/最大 = 10.241/12.084/14.111 ms 但是,中文环境下,ping输出的统计行也可能使用英文(决于系统语言设置)。为了避免复杂,我们假设系统语言是英文,或者使用LANG=C强制为英文。 因此,我们可以先设置环境变量LANG=C,确保ping输出为英文。 修改:在脚本中临时设置LANG=C LANG=C ping -c4 -q $ip 这样,输出就是英文,然后我们就可以用: rtt min/avg/max/mdev = 10.241/12.084/14.111/1.431 ms 然后,我们使用awk: awk -F'[ /]' '/rtt/ {print $4}' # 但是这样分割可能不准确,因为等号前后有空格 另一种方法:使用等号分割,然后第二部分,再用'/'分割,第二个值。 awk -F'=' '/rtt / {print $2}' | awk '{print $1}' | awk -F'/' '{print $2}' 简化: awk -F'[ =/]+' '/rtt / {print $(NF-2)}' # 但是这样可能受字段数影响 更可靠的方法: ping -c4 -q $ip | awk -F'/' '/rtt / { print $5 }' 在英文输出中,包含'rtt'的行,以'/'分割,第5个字段就是平均值(因为该行有多个'/',例如:min/avg/max/mdev的值用'/'分隔,所以第二个就是avg,即第5个字段?) 实际上,该行分割后: 字段1: "rtt min" 字段2: "avg" 字段3: "max" 字段4: "mdev = 10.241" -> 这样不合适 正确方法:将整个等号后面的部分分割? 例如:`rtt min/avg/max/mdev = 10.241/12.084/14.111/1.431` 我们先用等号分割,得到第二部分:`10.241/12.084/14.111/1.431 ms` 然后掉空格,再用'/'分割,第二个。 因此,我们可以: ping -c4 -q $ip | awk -F'=' '/rtt / {print $2}' | awk '{print $1}' | awk -F'/' '{print $2}' 或者: ping -c4 -q $ip | grep rtt | awk -F'/' '{print $5}' 但是注意,在英文输出中,包含'rtt'的那一行可能是: rtt min/avg/max/mdev = 10.241/12.084/14.111/1.431 ms 分割符为'/',则: 第1段:rtt min 第2段:avg 第3段:max 第4段:mdev = 10.241 然后接着是12.084, 14.111, 1.431 所以,实际上,等号后面的部分被分割成多个字段?不对,整个字符串都会被分割。 我们重新看: 字符串: "rtt min/avg/max/mdev = 10.241/12.084/14.111/1.431 ms" 以'/'分割,会分成: 1. "rtt min" 2. "avg" 3. "max" 4. "mdev = 10.241" 5. "12.084" 6. "14.111" 7. "1.431 ms" 所以,平均延迟在第5段?但是第4段是“mdev = 10.241”,第5段是12.084,这个12.084才是avg?不对,等号后面第一个数字10.241是min,第二个12.084是avg,所以avg出现在第5个字段? 不对,正确的分割后,等号后面的第一个数字(10.241)是在第4段的末尾,第5段是12.084。所以avg的值在第5段。 但是,我们也可以这样:直接等号后面的部分,然后按空格和'/'分割,那么第一个数字是min,第二个是avg。 因此,我们可以这样: ping -c4 -q $ip | awk -F'=' '/rtt / {print $2}' | awk '{print $1}' | awk -F'/' '{print $2}' 这样,先等号后面的部分,然后掉后面的空格(第一个awk$2,然后第二个awk$1,得到的是10.241/12.084/14.111/1.431),再按'/'分割,第二个就是12.084。 所以,这个命令可以正确提出平均值。 但是,如果ping不通,就不会有rtt行,所以我们需要判断。 完整脚本步骤: 1. 获域名(作为参数传入) 2. 获域名的IP列表(使用`host`命令,并过滤出IPv4地址) 例如:host $domain | grep 'has address' | awk '{print $4}' 3. 遍历IP列表,对每个IP执行ping测试并获平均延迟 4. 记录最小延迟的IP 注意:如果IP不通,则跳过,或者设置一个很大的延迟。 脚本如下: </think>以下是通过Shell脚本域名最优IP(PING延迟最小)的完整解决方案,结合引用内容进行优化: ### 解决方案 ```bash #!/bin/bash # 获域名最优IP(PING延迟最小) # 检查参数 if [ $# -ne 1 ]; then echo "Usage: $0 <域名>" exit 1 fi DOMAIN=$1 # 1. 获域名所有解析IP(IPv4) IP_LIST=$(host -t A $DOMAIN | awk '/has address/ {print $4}' | sort -u) if [ -z "$IP_LIST" ]; then echo "错误:无法解析域名" exit 2 fi # 2. 测试IP延迟 declare -A DELAY_MAP MIN_DELAY=10000 OPTIMAL_IP="" for IP in $IP_LIST; do # 使用-c控制次数,-q减少输出(引用[1][4]) PING_OUTPUT=$(ping -c 4 -q $IP 2>/dev/null) # 解析平均延迟(兼容中英文输出) AVG_DELAY=$(echo "$PING_OUTPUT" | awk -F'/' ' /rtt|round-trip|平均 = / { for(i=1;i<=NF;i++) { if($i ~ /^avg=|^平均 = /) { split($(i+1), arr, " ") print arr[1] exit } } } ') # 有效延迟检测 if [[ $AVG_DELAY =~ ^[0-9.]+$ ]]; then DELAY_MAP[$IP]=$AVG_DELAY echo "IP:$IP 延迟:${AVG_DELAY}ms" # 更新最优IP(引用[3]时间计算思想) if (( $(echo "$AVG_DELAY < $MIN_DELAY" | bc -l) )); then MIN_DELAY=$AVG_DELAY OPTIMAL_IP=$IP fi else echo "IP:$IP 无法连接" fi done # 3. 输出结果 if [ -n "$OPTIMAL_IP" ]; then echo "--------------------------------" echo "域名: $DOMAIN" echo "最优IP: $OPTIMAL_IP" echo "最低延迟: ${MIN_DELAY}ms" else echo "错误:所有IP均不可达" exit 3 fi ``` ### 使用示例 ```bash chmod +x optimal_ip.sh ./optimal_ip.sh www.baidu.com ``` 输出示例: ``` IP:14.215.177.38 延迟:32.45ms IP:14.215.177.39 延迟:28.16ms IP:14.215.177.40 延迟:45.21ms -------------------------------- 域名: www.baidu.com 最优IP: 14.215.177.39 最低延迟: 28.16ms ``` ### 关键技术点 1. **IP获优化** `host -t A`精确获IPv4地址,`sort -u`重(引用[2]列表处理思想) 2. **延迟测试优化** - `-c 4`: 发送4个包平衡速度与准确性(引用[1]) - `-q`: 抑制详细输出只显示统计结果(引用[4]) - 动态解析中英文输出(兼容`rtt min/avg/max`和`平均 =`格式) 3. **数据处理** - 关联数组存储IP-延迟映射`declare -A DELAY_MAP` - BC工具比较浮点数`echo "$AVG_DELAY < $MIN_DELAY" | bc -l` 4. **错误处理** - 域名解析失败检测 - 所有IP不可达处理 - 无效延迟过滤(正则验证数字) ### 进阶监控版 ```bash #!/bin/bash # 长期监控最优IP(引用[4]长ping思想) DOMAIN=$1 while true; do TS=$(date "+%Y-%m-%d %H:%M:%S") OPTIMAL_IP=$(./optimal_ip.sh $DOMAIN | awk '/最优IP:/ {print $2}') echo "[$TS] 当前最优IP: $OPTIMAL_IP" sleep 300 # 每5分钟检测一次 done ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值