有条件地用单词替换数字

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;)

同时使用 nmapfpingarp 可能会更快,因为按顺序 ping 每个 ip...