Comandos Bash cut e grep através do python

2

Eu tentei ler um arquivo txt e encontrar as linhas que contêm uma determinada palavra "checkout_revision". Eu quero encontrar essas linhas uma por uma em um loop e armazená-las na minha variável, digamos temp. Eu ouvi que grep com cut é adequado para isso. No entanto, eu não pude fazer isso. Existe alguém para me ajudar? Aqui está o meu código:

for line in intersect:
        cmd=""" grep "CHECKOUT_REVISION" |cut -d\'\"\' -f2"""%fst_directory
        cmd_test=os.system(cmd)
    
por caesar 23.08.2013 / 17:24

4 respostas

4

Suponha que haja um arquivo /home/eday/test.txt com o conteúdo abaixo:

this is a test


another line

CHECKOUT_REVISION this must be stored

some other things
CHECKOUT_REVISION another line to store

O seguinte script Python lerá o arquivo armazenado na variável my_file , procurando o que está armazenado na variável look_for e, se encontrar uma correspondência, armazenará na variável temp , que é uma variável de lista. / p>

Finalmente, imprimirá na saída o conteúdo de temp Você pode comentar ou excluir a linha de impressão.

#!/usr/bin/env python

# path to the file to read from
my_file = "/home/eday/test.txt"
# what to look in each line
look_for = "CHECKOUT_REVISION"
# variable to store lines containing CHECKOUT_REVISION
temp = []

with open(my_file, "r") as file_to_read:
    for line in file_to_read:
        if look_for in line:
            temp.append(line)

# print the contents of temp variable
print (temp)

o script acima terá a seguinte saída no terminal:

$ ['CHECKOUT_REVISION this must be stored', 'CHECKOUT_REVISION another line to store']
    
por Stef K 23.08.2013 / 20:36
1
result = []
for line in open('filename'):
    if 'CHECKOUT_REVISION' in line:
        result.append(line.split('\'"\'')[1])

Suponho que isso é o que você deseja - você obtém uma lista de strings com o segundo campo de cada linha que contém a string CHECKOUT_REVISION . A questão deve ser movida para stackoverflow .

    
por moon.musick 23.08.2013 / 18:28
1

Inspirado nas respostas acima, aqui está a versão de linha de comando.

#!/usr/bin/env python

import sys

pattern = sys.argv[1]
fileName = sys.argv[2]


count=0
temp = []

with open(fileName, "r") as file_to_read:
    for line in file_to_read:
        if pattern in line:
           #IN case you want to have number of hits
           count=count+1
           temp.append(line)



for i in range(count):
    print (temp[i].rstrip())

Execute como:

python "pattern" thisScript.py 
    
por monk 29.04.2016 / 11:38
0

Concordo que Stef 's answer é uma boa resposta, mas se você ainda quiser usar os comandos grep ou cut (ou outros) do bash em python, sugiro que não use os.system , mas para usar o módulo subprocess . Por exemplo:

#!/usr/bin/env python

import subprocess

cmd = "grep CHECKOUT_REVISION /home/eday/test.txt | cut -d'\"' -f2 -s"
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
temp = process.communicate()[0]

print (temp)

Se o arquivo /home/eday/test.txt for algo assim:

some lines
CHECKOUT_REVISION="revision one"
some other lines
CHECKOUT_REVISION="revision two"
other lines

a saída do script python acima será:

revision one
revision two
    
por Radu Rădeanu 23.08.2013 / 21:54