2017-09-03 135 views
0

我從多播地址分析流。該命令的輸出看起來是這樣的:來自命令輸出的grep特定字符串

... 
Sep 03 19:06:45: INFO: Bitrate: 8241 Kbit/s 
Sep 03 19:06:45: ERROR: Scrambled: 250=4792 251=132 252=132 253=263 
... 

我需要後比特率獲得價值: [8241]和PHP腳本設置弗里斯特變量,後炒:只有前「=」 [250251252253]爲第二個變量。 示例$var1=8241; $var2=250,251,252,253。我發現如何grep -oP '(?<=Bitrate:)[0-9]+',所以我得到「8241」,但我需要兩個變量我一步。

+1

是 '炒' 線總是跟隨'比特率'線?它們之間可能有多條不同的線?或者你只是想要1個正則表達式能夠分別處理兩條線? –

回答

1

您將同時將所需值寫入2個變量會有問題。

所以這裏有一個完整的PHP溶液(使用shell_exec函數調用AWK腳本):

<?php 

$command = 'yourcommand | awk \'/Bitrate/{ printf "%d ", $6 }/Scrambled/{ for(i=6;i<=NF;i++)' 
          . 'printf "%d ",substr($i,1,index($i,"=")) }\' 
'; 
$result = trim(shell_exec($command)); 
if ($result) { 
    $arr = explode(" ", $result); 
    $bitrate = $arr[0]; 
    $scrambled = array_slice($arr, 1); 
} 

print_r('bitrate: ' . $bitrate . PHP_EOL); 
print_r('scrambled: '); 
print_r($scrambled); 

格式化輸出:

bitrate: 8241 
scrambled: Array 
(
    [0] => 250 
    [1] => 251 
    [2] => 252 
    [3] => 253 
) 
+0

嗨,感謝您快速回答我的問題! 我明白logik,但是,我沒有使用文件。我需要的是**命令分析| awk **,我用這個代碼traynig但不是結果。使用特定分隔符使用一個變量會更容易。示例結果** 8241#250,251,252,253 ** – Zeljko

+0

@Zeljko,在開始時運行'your command | myawk(沒有文件名)'在shell中,並確保它返回結果 – RomanPerekhrest

+0

'$ command ='timeout 2 /my_src/astra/./astra --analyze udp://[email protected]:22231 | awk \'/ Bitrate/{printf「%d」,$ 6}/Scrambled/{for(i = 6; i <= NF; i ++)' 。 'printf'%d「,substr($ i,1,index($ i,」=「))}'' ';'這個返回'[log]沒有寫入stdout [Broken pipe]'。源命令返回(所有行)https://pastebin.com/zjWKQsaD – Zeljko