cat, grep et cut-traduit en python

peut-être qu'il y a assez de questions et/ou de solutions pour cela, mais je ne peux pas m'en empêcher avec cette seule question: j'ai la commande suivante que j'utilise dans un script bash:

var=$(cat "$filename" | grep "something" | cut -d'"' -f2)    

maintenant, à cause de certains problèmes, je dois traduire tout le code en python. Je n'ai jamais utilisé python avant et je n'ai absolument aucune idée comment je peux faire ce que les commandes postet font. Des idées pour résoudre ça avec python?

25
demandé sur dnc 2014-10-30 20:06:07

5 réponses

vous devez avoir une meilleure compréhension du langage python et de sa bibliothèque standard pour traduire l'expression

cat" $filename " : lit le fichier cat "$filename" et renvoie le contenu à stdout

| : pipe redirige le stdout de la commande précédente et l'alimente au stdin de la commande suivante

grep "something " : recherche l'expression régulière something fichier de données en texte brut (si spécifié) ou dans le stdin et renvoie les lignes correspondantes.

cut-d' "'- f2 : divise la chaîne avec le délimiteur spécifique et indexe / divise des champs particuliers de la liste résultante

Équivalent Python

cat "$filename"  | with open("$filename",'r') as fin:        | Read the file Sequentially
                 |     for line in fin:                      |   
-----------------------------------------------------------------------------------
grep 'something' | import re                                 | The python version returns
                 | line = re.findall(r'something', line)[0]  | a list of matches. We are only
                 |                                           | interested in the zero group
-----------------------------------------------------------------------------------
cut -d'"' -f2    | line = line.split('"')[1]                 | Splits the string and selects
                 |                                           | the second field (which is
                 |                                           | index 1 in python)

combinaison

import re
with open("filename") as origin_file:
    for line in origin_file:
        line = re.findall(r'something', line)
        if line:
           line = line[0].split('"')[1]
        print line
58
répondu Abhijit 2016-06-09 16:54:38

en Python, sans dépendances externes, c'est quelque chose comme ceci (non testé):

with open("filename") as origin:
    for line in origin:
        if not "something" in line:
           continue
        try:
            print line.split('"')[1]
        except IndexError:
            print
6
répondu Paulo Scardine 2016-02-17 17:07:07

vous devez utiliser os.system module pour exécuter la commande shell

import os
os.system('command')

si vous souhaitez enregistrer la sortie pour une utilisation ultérieure, vous devez utiliser subprocess module

import subprocess
child = subprocess.Popen('command',stdout=subprocess.PIPE,shell=True)
output = child.communicate()[0]
4
répondu Hackaholic 2014-10-30 17:08:09

pour traduire la commande en python référez-vous ci-dessous: -

1) Alternative de la commande cat est ouverte refer this . Ci-dessous, l'échantillon

>>> f = open('workfile', 'r')
>>> print f

2)variante de la commande grep renvoyer this

3)variante de la commande de coupure se référer à this

2
répondu Hussain Shabbir 2017-05-23 12:26:27

Vous avez besoin d'une boucle sur les lignes d'un fichier, vous avez besoin d'apprendre au sujet de méthodes string

with open(filename,'r') as f:
    for line in f.readlines():
        # python can do regexes, but this is for s fixed string only
        if "something" in line:
            idx1 = line.find('"')
            idx2 = line.find('"', idx1+1)
            field = line[idx1+1:idx2-1]
            print(field)

et vous avez besoin de une méthode pour passer le nom de fichier à votre programme python et pendant que vous y êtes, peut-être aussi la chaîne de caractères à rechercher...

pour l'avenir, essayez de poser des questions plus ciblées si vous le pouvez,

2
répondu gboffi 2017-02-23 18:48:54