2013-01-02 8 views
5

मेरे पास एक सिस्टम स्क्रिप्ट है जो "ps aux | grep utilities" के परिणामों को टेक्स्टफाइल पर चलाती है और पाइप करती है ताकि टेक्स्टफाइल को दिखाया जा सके ताकि वेब सेवा फ़ाइल को पढ़ सके और परिणाम मेरे वेब ऐप में प्रदर्शित कर सके।PHP grep ... परिणाम

यहाँ कच्चे परिणाम का एक उदाहरण है:

user  12052 0.2 0.1 137184 13056 ?  Ss 10:00 0:00 php /home/user/public_html/utilities/runProcFile.php cust1 cron 
user  12054 0.2 0.1 137184 13064 ?  Ss 10:00 0:00 php /home/user/public_html/utilities/runProcFile.php cust3 cron 
user  12055 0.6 0.1 137844 14220 ?  Ss 10:00 0:00 php /home/user/public_html/utilities/runProcFile.php cust4 cron 
user  12057 0.2 0.1 137184 13052 ?  Ss 10:00 0:00 php /home/user/public_html/utilities/runProcFile.php cust89 cron 
user  12058 0.2 0.1 137184 13052 ?  Ss 10:00 0:00 php /home/user/public_html/utilities/runProcFile.php cust435 cron 
user  12059 0.3 0.1 135112 13000 ?  Ss 10:00 0:00 php /home/user/public_html/utilities/runProcFile.php cust16 cron 
root  12068 0.0 0.0 106088 1164 pts/1 S+ 10:00 0:00 sh -c ps aux | grep utilities > /home/user/public_html/logs/dashboard/currentlyPosting.txt 
root  12070 0.0 0.0 103240 828 pts/1 R+ 10:00 0:00 grep utilities 

मेरी php स्क्रिप्ट इस textfile पार्स करता है के रूप में, मैं केवल निम्नलिखित (सिर्फ एक उदाहरण) को निकालने के लिए की जरूरत है:

cust1 
cust3 
cust4 
cust89 
cust435 
cust16 

मेरे पास है कई अलग-अलग तरीके से कोशिश की और कुछ भी अच्छी तरह से काम नहीं कर रहा है। जिस तरह से मैंने नीचे सूचीबद्ध किया है, लेकिन कभी-कभी कचरा भी पकड़ता है क्योंकि परिवर्तनों पर विस्फोट करने के लिए एक पंक्ति में "रिक्त स्थान" की संख्या।

public function showProcesses() { 
    $lines = file(DIR_LOGGER_ROOT . "dashboard/currentlyPosting.txt"); 
    $results = array(); 
    $i = 0; 
    foreach($lines as $line) { 
     if (preg_match("/php/i", $line)) { 
      $userProcess = explode(" ", $line); 
      if($userProcess[29] != "0:00" && strlen($userProcess[29]) < 20) { 
       $results[$i] = $userProcess[29]; 
       $i++; 
      } 
     } 
    } 
    return $results; 
} 

क्या आप में से कुछ इस के लिए सुरुचिपूर्ण समाधान पोस्ट कर सकते हैं? मैं चीजों को करने के बेहतर तरीके सीखने की कोशिश कर रहा हूं और मार्गदर्शन की सराहना करता हूं।

+0

यदि आप ऐसा करना एक कमांड लाइन अनुप्रयोग लिख रहे हैं, मैं बेहतर स्ट्रिंग से निपटने और पर्ल की तरह regexes के लिए अनुकूल एक भाषा उपयोग करने का सुझाव:

तो फिर तुम साथ अंत से पहले आइटम प्राप्त कर सकते हैं। आप सीधे प्रक्रिया तालिका तक पहुंचने के लिए सीपीएएन पर कुछ भी ढूंढ सकते हैं, जैसे कि http://search.cpan.org/dist/Proc-ProcessTable/ –

+0

डेटा इकट्ठा किया जाता है और सिस्टम स्क्रिप्ट से टेक्स्टफाइल पर लिखा जाता है। यह मेरे वेब ऐप से निष्पादन और रूट का उपयोग किए बिना टेक्स्टफाइल को मेरे वेब ऐप तक पहुंच योग्य बनाता है। लेकिन परिणामों को पार्स करना वेब ऐप के लिए है इसलिए php समझ में आता है। –

उत्तर

0

मैं preg_match() का उपयोग करूंगा। मैं अपनी कई सिस्टम प्रबंधन स्क्रिप्ट के लिए कुछ ऐसा करता हूं।

$test = "user  12052 0.2 0.1 137184 13056 ?  Ss 10:00 0:00 php /home/user/public_html/utilities/runProcFile.php cust1 cron 
user  12054 0.2 0.1 137184 13064 ?  Ss 10:00 0:00 php /home/user/public_html/utilities/runProcFile.php cust3 cron 
user  12055 0.6 0.1 137844 14220 ?  Ss 10:00 0:00 php /home/user/public_html/utilities/runProcFile.php cust4 cron 
user  12057 0.2 0.1 137184 13052 ?  Ss 10:00 0:00 php /home/user/public_html/utilities/runProcFile.php cust89 cron 
user  12058 0.2 0.1 137184 13052 ?  Ss 10:00 0:00 php /home/user/public_html/utilities/runProcFile.php cust435 cron 
user  12059 0.3 0.1 135112 13000 ?  Ss 10:00 0:00 php /home/user/public_html/utilities/runProcFile.php cust16 cron 
root  12068 0.0 0.0 106088 1164 pts/1 S+ 10:00 0:00 sh -c ps aux | grep utilities > /home/user/public_html/logs/dashboard/currentlyPosting.txt 
root  12070 0.0 0.0 103240 828 pts/1 R+ 10:00 0:00 grep utilities"; 

$lines = explode("\n", $test); 

foreach($lines as $line){ 
     if(preg_match("/.php[\s+](cust[\d]+)[\s+]cron/i", $line, $matches)){ 
       print_r($matches); 
     } 

} 

ऊपर प्रिंट:

Array 
(
    [0] => .php cust1 cron 
    [1] => cust1 
) 
Array 
(
    [0] => .php cust3 cron 
    [1] => cust3 
) 
Array 
(
    [0] => .php cust4 cron 
    [1] => cust4 
) 
Array 
(
    [0] => .php cust89 cron 
    [1] => cust89 
) 
Array 
(
    [0] => .php cust435 cron 
    [1] => cust435 
) 
Array 
(
    [0] => .php cust16 cron 
    [1] => cust16 
) 

आप कार्यकारी से उत्पादन के बराबर करने के $test सेट कर सकते हैं यहाँ एक उदाहरण है। जो मूल्य आप खोज रहे हैं if कथन foreach के तहत होगा। $matches[1] में कस्टक्स वैल्यू होगा।

1

आप preg_split का उपयोग explode के बजाय कर सकते हैं और [ ]+ (एक या अधिक रिक्त स्थान) पर विभाजित कर सकते हैं। लेकिन मैं इस मामले में लगता है कि आप preg_match_all और capturing साथ जा सकते हैं:

preg_match_all('/[ ]php[ ]+\S+[ ]+(\S+)/', $input, $matches); 
$result = $matches[1]; 

पैटर्न एक अंतरिक्ष, php, अधिक रिक्त स्थान, गैर रिक्त स्थान (पथ) के एक स्ट्रिंग, और अधिक रिक्त स्थान से मेल खाता है, और फिर कब्जा गैर-रिक्त स्थान की अगली स्ट्रिंग। पहली जगह यह सुनिश्चित करने के लिए है कि आप उपयोगकर्ता नाम के हिस्से के रूप में php से मेल नहीं खाते हैं लेकिन वास्तव में केवल एक कमांड के रूप में।

कैप्चरिंग का एक विकल्प पीसीआरई की "रखो" सुविधा है।

preg_match_all('/[ ]php[ ]+\S+[ ]+\K\S+/', $input, $matches); 
$result = $matches[0]; 
0

मूल्यों के बीच अपनी लाइन में स्थानों की संख्या चर रहा है, तो आप इस्तेमाल कर सकते हैं preg_split

तुम बस होगा: आप पैटर्न में \K उपयोग करते हैं, सब कुछ पहले यह मैच में त्याग दिया जाता है बदलने के लिए:

$userProcess = explode(" ", $line); 

रहे हैं:

$userProcess = preg_split("#\s+#", $line); 

\s+ एक या अधिक रिक्त स्थान, टैब या अन्य श्वेत-स्थान वर्णों से मेल खाएगा।

$txt = $userProcess[count($userProcess) - 2];