有条件地用单词替换数字
conditionally replacing number with word
我正在使用 Python 脚本每 2 分钟检测一次本地网络中的已连接设备 - 将输出保存在一个文件中(我只保存 IP 的最后一个数字)。
这是我的代码:
import os
os.system('for ip in $(seq 1 10); do ping -c 1 192.168.1.$ip>/dev/null; '
'[ $? -eq 0 ] && echo "$ip" || : ; '
'done > /home/pi/Desktop/Network/logs/logLocal.txt')
输出例如:
1
2
4
7
我现在的问题是是否可以通过一个词来代替数字7?
如果找到设备 7,程序会在文件中写入 "seven" 而不是 7。
感谢您的帮助!
以下脚本将完成这项工作:
# Note that you can use `{a..b}` instead of `seq`
for ip in {1..10} ; do
# No need to execute the command and then check it's
# return value. You can do it in one line
if ping -c 1 192.168.1.$ip > /dev/null ; then
# check for `7`
if [ "$ip" = "7" ] ; then
echo "seven"
else if [ "$ip" = 5 ] ; then
echo "five"
# ... and so on
else
echo "$ip"
fi
fi
done > output.txt
这看起来像 os.system()
中的 Unix 命令。因此,您可以将结果通过管道传输到 replace
到文件的途中:
import os
os.system('for ip in $(seq 1 10); do ping -c 1 192.168.1.$ip>/dev/null; '
'[ $? -eq 0 ] && echo "$ip" || : ; '
'done | replace 7 seven > /home/pi/Desktop/Network/logs/logLocal.txt')
有关 replace
的更多信息,请参阅 here。
如果 ping 不成功,check_call
将抛出一个 CalledProcessError
,这样我们就可以捕获该异常而不做任何事情,如果 ping 成功,我们使用的最后一位从字典中写入值ip
作为键。
from subprocess import check_call, CalledProcessError
from os import devnull
to_words = {1: 'one\n', 2: 'two\n', 3: 'three\n', 4: 'four\n', 5: 'five\n', 6: 'six\n', 7: 'seven\n', 8: 'eight\n', 9: 'nine\n',10:"ten\n"}
with open('/home/pi/Desktop/Network/logs/logLocal.txt', "w") as f:
for ip in range(1, 11):
try:
check_call(["ping", "-c", "1", "192.168.1.{}".format(ip)], stdout=open(devnull, "w"))
f.write(to_words[ip])
except CalledProcessError:
pass
#
我将执行以下操作:
- 将所有 "number word" 对存储在文件中作为
num name
- 读取文件
- ping 号码
- 如果成功则回显名称
脚本:
devices="./dev"
while read -r num name
do
ping -c 1 -t1 192.168.1.$num >/dev/null 2>&1 && echo "$name up"
done < "$devices"
顺便说一句,稍微修改一下,你可以直接使用/etc/hosts
;)
同时使用 nmap
或 fping
或 arp
可能会更快,因为按顺序 ping 每个 ip...
我正在使用 Python 脚本每 2 分钟检测一次本地网络中的已连接设备 - 将输出保存在一个文件中(我只保存 IP 的最后一个数字)。
这是我的代码:
import os
os.system('for ip in $(seq 1 10); do ping -c 1 192.168.1.$ip>/dev/null; '
'[ $? -eq 0 ] && echo "$ip" || : ; '
'done > /home/pi/Desktop/Network/logs/logLocal.txt')
输出例如:
1
2
4
7
我现在的问题是是否可以通过一个词来代替数字7? 如果找到设备 7,程序会在文件中写入 "seven" 而不是 7。
感谢您的帮助!
以下脚本将完成这项工作:
# Note that you can use `{a..b}` instead of `seq`
for ip in {1..10} ; do
# No need to execute the command and then check it's
# return value. You can do it in one line
if ping -c 1 192.168.1.$ip > /dev/null ; then
# check for `7`
if [ "$ip" = "7" ] ; then
echo "seven"
else if [ "$ip" = 5 ] ; then
echo "five"
# ... and so on
else
echo "$ip"
fi
fi
done > output.txt
这看起来像 os.system()
中的 Unix 命令。因此,您可以将结果通过管道传输到 replace
到文件的途中:
import os
os.system('for ip in $(seq 1 10); do ping -c 1 192.168.1.$ip>/dev/null; '
'[ $? -eq 0 ] && echo "$ip" || : ; '
'done | replace 7 seven > /home/pi/Desktop/Network/logs/logLocal.txt')
有关 replace
的更多信息,请参阅 here。
check_call
将抛出一个 CalledProcessError
,这样我们就可以捕获该异常而不做任何事情,如果 ping 成功,我们使用的最后一位从字典中写入值ip
作为键。
from subprocess import check_call, CalledProcessError
from os import devnull
to_words = {1: 'one\n', 2: 'two\n', 3: 'three\n', 4: 'four\n', 5: 'five\n', 6: 'six\n', 7: 'seven\n', 8: 'eight\n', 9: 'nine\n',10:"ten\n"}
with open('/home/pi/Desktop/Network/logs/logLocal.txt', "w") as f:
for ip in range(1, 11):
try:
check_call(["ping", "-c", "1", "192.168.1.{}".format(ip)], stdout=open(devnull, "w"))
f.write(to_words[ip])
except CalledProcessError:
pass
#
我将执行以下操作:
- 将所有 "number word" 对存储在文件中作为
num name
- 读取文件
- ping 号码
- 如果成功则回显名称
脚本:
devices="./dev"
while read -r num name
do
ping -c 1 -t1 192.168.1.$num >/dev/null 2>&1 && echo "$name up"
done < "$devices"
顺便说一句,稍微修改一下,你可以直接使用/etc/hosts
;)
同时使用 nmap
或 fping
或 arp
可能会更快,因为按顺序 ping 每个 ip...