2017-09-03 49 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