grep在shell脚本中使用python(loop)变量和字符串

2024-06-01 02:07:51 发布

您现在位置:Python中文网/ 问答频道 /正文

上下文: 我有一个内部的Linux命令,比如说“signals”,它将输出oozie在那天放置的任何信号。

例如:

$signals | grep -i empty
*/user/oozie/coordinator/signals/2017/10/12/oltp1/_insurance_transaction_empty*
*/user/oozie/coordinator/signals/2017/10/12/oltp2/_loan_transaction_empty*

$signals | grep -i maxid
*/user/oozie/coordinator/signals/2017/10/12/oltp1/_insurance_transaction_maxid*
*/user/oozie/coordinator/signals/2017/10/12/oltp1/_loan_transaction_maxid*

我正在写一个python脚本,它每天运行,并将grep为“empty”和“maxid”信号peroltp并发送电子邮件。

假设oltp1有空信号,oltp2有maxid信号。它将发送一封包含所有oltp和信号的电子邮件。

我有一个配置文件,其中一列包含所有OLTP:

^{pr2}$

代码:

#!/usr/bin/python

import commands
import os

config_file="/home/xxx/config_file"
for var in confil_file:
    var=var.strip()
    print " checking with OLTP:"+var
    empty_cnt_loan=commands.getoutput("signals | grep -i empty | grep -i $var | wc -l")
    maxid_cnt_loan=commands.getoutput("signals | grep -i maxid | grep -i $var| wc -l")
    print empty_cnt_loan

尝试次数: 尝试使用$var

ERROR: grep: write error:Broken Pipe

尝试使用%var empty_cnt_loan的值为0,当我在linux box中运行命令时,它的值为2。

我试过子流程,但由于我是新来的,所以不知道如何使用它。。任何帮助都将不胜感激。


Tags: 信号vargrepcommandsfileemptytransactionsignals
1条回答
网友
1楼 · 发布于 2024-06-01 02:07:51

运行复杂的Bash管道来完成Python中微不足道的事情是一种反模式。只需运行signals一次,然后在Python中循环输出。在

假设Python 3.6+

#!/usr/bin/env python3

from subprocess import run, PIPE

with open("/home/xxx/config_file") as config:
    vars = [line.strip() for line in config.readlines()]
empty_cnt_loan = {x: 0 for x in vars}
maxid_cnt_loan = {x: 0 for x in vars}
p = run(['signals'], stdout=PIPE, check=True, universal_newlines=True)
for line in p.stdout.split('\n'):
    line = line.lower()
    for var in vars:
        if var in line:
            if 'maxid' in line:
                maxid_cnt_loan[var] += 1
            if 'empty' in line:
                empty_cnt_loan[var] += 1

顺便说一句,grep有一个选项-c来计算匹配的数量;但是当您使用Python时,您几乎永远不需要grep(或Awk,或sed,或{},或其他一些标准实用程序)。在

相关问题 更多 >