python - 用 Python 解析 Linux 命令
问题描述
这是我使用 pexpect 的代码的快速片段:
child.expect('tc@')
child.sendline('ps -o args | grep lp_ | grep -v grep | sort -n')
child.expect('tc@')
print(child.before)
child.sendline('exit')
然后是输出:
user@myhost:~/Python$ python tctest.py
tc-hostname:~$ ps -o args | grep lp_ | grep -v grep | sort -n
/usr/local/bin/lp_server -n 5964 -d /dev/usb/lp1
/usr/local/bin/lp_server -n 5965 -d /dev/usb/lp0
{lp_supervisor} /bin/sh /usr/local/lp/lp_supervisor /dev/usb/lp0 SERIAL#1 /var/run/lp/lp_pid/usb_lp0
{lp_supervisor} /bin/sh /usr/local/lp/lp_supervisor /dev/usb/lp1 SERIAL#2 /var/run/lp/lp_pid/usb_lp1
user@myhost:~$
有4行输出。前两行显示 USB 设备分配到的打印机端口(例如:第一行显示端口 5964 分配给 lp1)
第 3 行和第 4 行显示哪个设备序列号分配给哪个 USB 端口。(例如:SERIAL#1 分配给 lp0)
我需要以某种方式解析该输出,以便可以执行以下操作:
If SERIAL#1 is not assigned to 5964:
run some command
else:
do something else
If SERIAL#2 is not assigned to 5965:
run some command
else:
do something else
我不确定如何操作该输出,以便获得所需的变量。任何帮助表示赞赏。
解决方案
您可以使用从 pexpect 数据中提取端口和串行信息re.findall
并执行类似的操作
import re
data = child.before
ports = re.findall(r'lp_server -n (\d+)', data)
# ['5964', '5965']
serials = re.findall(r'(SERIAL#\d+)', data)
# ['SERIAL#1', 'SERIAL#2']
list(zip(ports, serials))
# [('5964', 'SERIAL#1'), ('5965', 'SERIAL#2')]
for serial, port in zip(ports, serials):
# Check if serial and port matches expectation
推荐阅读
- c# - 使用仅 HTTP 会话 cookie 时,客户端如何知道其会话何时到期?
- filter - 如何根据规则排列特定单元格?
- pandas - 将宽大的熊猫数据框转换/重塑为长/表格形式?
- dynamic-programming - 同时子集和
- reactjs - 反应模态不显示
- sql-server - 按每个客户的订单和每个订单的项目对客户进行排名
- javascript - 无法从 Web 服务中检索 XML 列表
- javascript - 使用javascript将平面数组转换为嵌套数组
- python - 如何在使用 super() 访问基类方法时覆盖两个相互调用的方法?
- python - 如何获取登录用户的名称(Flask,SQLAlchemy)