2016-05-25 15 views
2

我可以使用的Bash/Python的工藝匹配

pgrep -f 'keyword1 | keyword2' 

運行p纖ep和返回匹配要麼關鍵字的所有進程。

如何使用&做到這一點呢?我只是想同時包含關鍵字

下面的模式失敗的進程:

pgrep -f 'keyword1 & keyword2' 
pgrep -f 'keyword2 && keyword2' 

MAN p纖ep(1)

OPTIONS

-f該模式通常只對匹配過程 名稱。當設置-f時,將使用完整的命令行。

方問題: 有一個內置在Python庫運行這些命令?我似乎找不到一個人,每個人都建議使用subprocess.Popen(),這是我如何運行'pgrep'命令,但是我更喜歡純Python解決方案,如果它可用

+0

你聽說過're'模塊的? –

+0

我確實。這是正則表達式是啊?如果我通過subprocess.Popen('pgrep [re]')運行它,bash命令是否會選取Python正則表達式? – AK47

+0

你想要返回什麼,一個pid列表? –

回答

1

您可以使用或使用通配符反轉模式以獲得在任何次序關鍵字。

pgrep -f 'keyword1.*keyword2|keyword2.*keyword1' 
+1

pgrep -f擴展搜索 – AK47

0

典型的方法grep'和'grep多次。由於pgrep返回pids你必須直接過濾的進程列表,然後提取PID:

ps ax -o pid,cmd | grep 'keyword1' | grep 'keyword2' | awk '{print $2}' 
+1

您的代碼可以簡化爲'ps aux | awk'/ [k] eyword1/&&/keyword2/{print $ 2}''但由於列user,pid,cpu,mem,...可以匹配,所以仍然會產生誤報。 – andlrc

+0

@andlrc我不知道'awk',我不打算學習另一種我沒有多少用處的奇怪的shell語言,如果別人也一樣,我不會感到驚訝。這只是一個提取列的好方法。多重grep模式很容易理解,可以應用於根本不需要awk的情況。 –

+1

這就是你如何看待它。我會說grep根本就不需要。但是,如果你以你的觀點說話,你可能會考慮用'tr -s''|來改變awk部分cut -d''-f2';) – andlrc

4

我不知道你可以做到這一點pgrep但是,您可以用awk:

ps ax -o pid,cmd | awk '{pid = $1; $1=""}/[k]eyword1/ && /keyword2/ {print pid}' 

我使用[k]eyword1的原因是爲了避免與awk進程匹配。

如果PCRE與p纖ep這樣的事情會工作的支持:

pgrep -f '(?=.*keyword1)(?=.*keyword2)'