Linux 有条件地用词替换数字

Linux 有条件地用词替换数字,linux,shell,terminal,Linux,Shell,Terminal,我使用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/Netwo

我使用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,程序会在文件中写入“7”,而不是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

以下脚本将执行此任务:

# 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')

有关在
os.system()
中看起来像Unix命令的
replace

的详细信息,请参阅。因此,您可以通过管道将结果传输到文件中的
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
检查的详细信息,请参阅。如果ping不成功,调用
将引发
CalledProcessError
,因此我们可以捕获该异常,而不执行任何操作。如果ping成功,我们将使用
ip
的最后一位作为键从dict写入值

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
#

check\u call
如果ping不成功,将引发一个
CalledProcessError
,因此我们可以捕获该异常,什么也不做。如果ping成功,我们将使用
ip
的最后一位作为键从dict写入值

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
#

我会这样做如下:

  • 将所有“数字-单词”对作为
    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"
devices=“/dev”
读取时-r num name
做
ping-c1-t1 192.168.1.$num>/dev/null 2>&1&&echo“$name up”
完成<“$devices”
顺便说一句,只需稍加修改,就可以直接使用
/etc/hosts


另外,使用
nmap
fping
arp
可以更快地按顺序ping每个ip…

我将执行以下操作:

  • 将所有“数字-单词”对作为
    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"
devices=“/dev”
读取时-r num name
做
ping-c1-t1 192.168.1.$num>/dev/null 2>&1&&echo“$name up”
完成<“$devices”
顺便说一句,只需稍加修改,就可以直接使用
/etc/hosts



另外,使用
nmap
fping
arp
可以更快地按顺序ping每个ip…

首先使用子流程,可能会输出哪些数字?您是否尝试将结果管道化以
替换“7”“7”
在重定向到输出文件之前?@PadraicCunningham编号1到10可能是Tiger的输出:你能给我发送一个链接,让我学习这个“管道”吗?我对这个完全陌生!您可以使用subprocess将输出重定向到一个文件,或者在python中实际执行除ping之外的所有操作,并使用dict将数字映射到单词。你基本上是在ping并返回ip的最后一个数字吗?是的,先生-例如,我的智能手机的ip是192.168.1.7-后来它只保存了数字-但我想为数字7保存一个单词-但可能发生的情况是设备7没有连接-然后什么都不应该发生-抱歉英语不好!首先使用子流程,可能会输出哪些数字?在重定向到输出文件之前,您是否尝试将结果管道化到
替换为“7”“7”
?@padraiccnningham数字1到10可能是Tiger的输出:您能给我发一个链接,让我学习这个“管道”吗?我对这个完全陌生!您可以使用subprocess将输出重定向到一个文件,或者在python中实际执行除ping之外的所有操作,并使用dict将数字映射到单词。你基本上是在ping并返回ip的最后一个数字吗?是的,先生-例如,我的智能手机的ip是192.168.1.7-后来它只保存了数字-但我想为数字7保存一个单词-但可能发生的情况是设备7没有连接-然后什么都不应该发生-抱歉英语不好!谢谢,先生-我可以为ip=5和4等添加额外的规则吗?谢谢,先生-我可以为ip=5和4等添加额外的规则吗?不用担心,如果您有更多的ip,只需增加范围并添加更多的键/值对,它比有多个if’要整洁得多s@piguy也许你应该考虑使用这个解决方案,因为它只需要在BASH中编写必要的操作,逻辑还保留在Python中。好的,谢谢-不管怎样,这些例子都很好用!我现在要用这个!不用担心,如果您有更多的ip,只需增加范围并添加更多的键/值对,它比有多个if’要整洁得多s@piguy也许你应该考虑使用这个解决方案,因为它只需要在BASH中编写必要的操作,逻辑还保留在Python中。好的,谢谢-不管怎样,这些例子都很好用!我现在要用这个!