python 中执行log cat |grep
时间: 2024-12-16 17:31:22 浏览: 11
在Python中,直接执行Linux命令行中的`logcat`和`grep`通常不是直接可用的,因为这些是终端命令而非Python内置函数。不过,你可以通过`subprocess`模块来模拟这种行为,让Python脚本间接调用外部命令。
如果你想在Python脚本中执行类似`logcat | grep pattern`的操作,可以这样做:
```python
import subprocess
# 替换`your_logcat_path`为你实际的logcat命令路径,如 '/path/to/logcat'
command = ['your_logcat_path', '-d'] + ('grep ' + 'pattern' if pattern else [])
# 执行命令,并捕获输出结果
output = subprocess.check_output(command, universal_newlines=True)
# 输出结果
print(output)
```
这里假设`pattern`是你想搜索的关键字,如果`pattern`不存在,命令行会省略`grep`部分。注意,这个例子假设你的系统已经正确配置了logcat环境,并且可以在命令行中直接运行。
相关问题
python脚本’”分别从远程登陆1运行a.py脚本抓取lspci|grep -i 'non' | cut -f1 -d ' ' 保存到log.txt,再从远程登录2,运行a.sh脚本保存到log的末尾。“一直循环跑5次并把log都追加到log.txt里面。‘
以下是一个可能的实现:
```python
import paramiko
import time
# 连接远程服务器1
ssh1 = paramiko.SSHClient()
ssh1.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh1.connect(hostname='server1.example.com', username='username', password='password')
# 连接远程服务器2
ssh2 = paramiko.SSHClient()
ssh2.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh2.connect(hostname='server2.example.com', username='username', password='password')
for i in range(5):
# 在远程服务器1运行a.py脚本并抓取输出
stdin, stdout, stderr = ssh1.exec_command('lspci | grep -i \'non\' | cut -f1 -d \' \'')
output1 = stdout.read().decode()
# 在远程服务器2运行a.sh脚本并抓取输出
stdin, stdout, stderr = ssh2.exec_command('cat log >> log.txt')
output2 = stdout.read().decode()
# 将输出写入log.txt文件
with open('log.txt', 'a') as f:
f.write(output1 + output2)
# 等待一段时间后再次执行
time.sleep(60)
```
这个脚本使用了`paramiko`模块来连接远程服务器并执行命令。在循环中,它首先在远程服务器1上运行`lspci | grep -i 'non' | cut -f1 -d ' '`命令,抓取输出并保存到`output1`变量中。然后在远程服务器2上运行`cat log >> log.txt`命令,将`log`文件的内容追加到`log.txt`文件的末尾,并抓取输出保存到`output2`变量中。最后将`output1`和`output2`写入`log.txt`文件中,并等待60秒后再次执行。这个过程会循环执行5次。
# -*- coding: utf-8 -*- import re import subprocess # 运行命令并获取输出 command = 'ls -rtd /home/cxcc/log/debug/* | tail -n 1 | xargs cat | grep "phoneModel"' output = subprocess.check_output(command, shell=True, universal_newlines=True) # 提取所有匹配项 pattern = r"设备品牌:(.+?) - 设备型号:(.+?) - 系统版本:(.+?) - APP版本:(.+?) - 录音位置:(.+?)\," matches = re.findall(pattern, output) # 提取所有agent属性 agent_pattern = r"agent=(\d+)" agent_matches = re.findall(agent_pattern, output) # 将匹配项和agent属性合并为一个列表 data = [(matches[i], agent_matches[i]) for i in range(len(matches))] # 将列表转换为set以删除重复项 unique_data = list(set(data)) # 对结果进行排序 unique_data.sort() # 将结果输出到txt文件中 with open("output.txt", "w") as f: for match, agent in unique_data: f.write("设备品牌:" + match[0] + "\n") f.write("设备型号:" + match[1] + "\n") f.write("系统版本:" + match[2] + "\n") f.write("APP版本:" + match[3] + "\n") f.write("录音位置:" + match[4] + "\n") f.write("agent:" + agent + "\n") f.write("\n") 这段代码有什么优化建议
这段代码的优化建议如下:
1. 使用subprocess.run代替subprocess.check_output,这样可以更好地处理错误情况。
2. 使用with语句管理文件句柄,可以自动关闭文件,不需要手动调用close()方法。
3. 将匹配和输出分离成两个函数,使代码更易读。
4. 使用re.finditer代替re.findall,可以避免在内存中创建一个完整的列表,而是每次迭代只产生一个匹配项。
5. 将re.compile放在函数外部,这样可以避免在每次调用函数时都重新编译正则表达式。
6. 添加一些注释,使代码更易于理解。
下面是优化后的代码示例:
```python
import re
import subprocess
# 编译正则表达式,以便在多次调用函数时重用
MATCH_PATTERN = re.compile(r"设备品牌:(.+?) - 设备型号:(.+?) - 系统版本:(.+?) - APP版本:(.+?) - 录音位置:(.+?)\,")
AGENT_PATTERN = re.compile(r"agent=(\d+)")
def get_output(command):
"""运行命令并返回输出结果。"""
try:
result = subprocess.run(command, shell=True, check=True, stdout=subprocess.PIPE, universal_newlines=True)
return result.stdout
except subprocess.CalledProcessError as e:
print(f"Error running command: {e}")
return ""
def extract_data(output):
"""从输出中提取匹配项和agent属性,返回一个包含它们的元组列表。"""
matches = MATCH_PATTERN.finditer(output)
agent_matches = AGENT_PATTERN.findall(output)
data = [(match.groups(), agent) for match, agent in zip(matches, agent_matches)]
return data
def write_output(data, filename):
"""将数据写入到指定的文件中。"""
with open(filename, "w") as f:
for match, agent in data:
f.write("设备品牌:" + match[0] + "\n")
f.write("设备型号:" + match[1] + "\n")
f.write("系统版本:" + match[2] + "\n")
f.write("APP版本:" + match[3] + "\n")
f.write("录音位置:" + match[4] + "\n")
f.write("agent:" + agent + "\n")
f.write("\n")
if __name__ == "__main__":
command = 'ls -rtd /home/cxcc/log/debug/* | tail -n 1 | xargs cat | grep "phoneModel"'
output = get_output(command)
data = extract_data(output)
# 将结果按照设备品牌进行排序
data.sort(key=lambda x: x[0][0])
write_output(data, "output.txt")
```
阅读全文