grep来自命令输出的特定字符串

我从多播地址分析流。 该命令的输出如下所示:</ p>

  ... 
Sep 03 19:06:45:INFO:比特率:8241 Kbit / s
Sep 03 19:06:45 :错误:加扰:250 = 4792 251 = 132 252 = 132 253 = 263
...
</ code> </ pre>

我需要在比特率后得到值:< / strong> [8241]并在php脚本中设置frist变量,并在加扰后</ strong>仅在“=”[250,251,252,253]之前为第二个变量。
示例 $ var1 = 8241; $ VAR2 = 250251252253 </代码>。 我发现了如何 grep -oP'(?&lt; = Bitrate:)[0-9] +'</ code>所以我得到“8241”,但我需要两个变量一步。</ p>
</ DIV>

展开原文

原文

I analyze stream from multicast address. Output of the command looks like this:

...
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
...

I need get value after Bitrate: [ 8241 ] and set frist variable in php script, and after Scrambled: only before "=" [250,251,252,253] for second variable. Example $var1=8241; $var2=250,251,252,253. I found how grep -oP '(?<=Bitrate: )[0-9]+' so I get "8241" but i need both variables i one step.

dougong5285
dougong5285 'scrambled'行是否始终是'bitrate'行的后续行动?是否有可能它们之间有多条不同的线?或者你只是想要一个能够分别处理两条线的正则表达式?
大约 3 年之前 回复

1个回答



将所需的值同时grep到2个变量中会有问题。</ p>

所以这是一个完整的 php </ em> </ strong>解决方案(使用 shell_exec </ code>函数调用 awk </ em> </ strong>脚本) :</ p>

 &lt;?php 

$ command ='yourcommand | awk \'/ Bitrate / {printf“%d”,$ 6} / Scrambled / {for(i = 6; i&lt; = 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);
</ code> </ pre>

格式化输出:</ p> \ n

 比特率:8241 
scrambled:Array

[0] =&gt; 250
[1] =&gt; 251
[2] =&gt; 252
[3 ] =&gt; 253

</ code> </ pre>
</ div>

展开原文

原文

It would be problematic for you to grep the needed values into the 2 variables simultaneously.

So here's a complete php solution (using shell_exec function to call awk script):

<?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);

Formatted output:

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

douxiong3234
douxiong3234 RomanPerekhrest我没错! 我得到结果8241 Kbit / s 250 = 4792 251 = 132 252 = 132 253 = 263另外命令awk -F'[[:space:] =]''/ Bitrate / || / Scrambled / {print $ 6}'返回 8241 250,但在Scrambled line上只有frist值(250)。
大约 3 年之前 回复
doujiu8826
doujiu8826 尝试以下超时2 /my_src/astra/./astra --analyze $ url | | grep -Po'。*(比特率| Scrambled):\ K. *'。 它应返回8241 Kbit / s 250 = 4792 251 = 132 252 = 132 253 = 263
大约 3 年之前 回复
dqkelut8423
dqkelut8423 RomanPerekhrest好的,但是用grep我得到正确的结果超时2 /my_src/astra/./astra --analyze $ url | grep -oP'(?<=比特率:)[0-9] +'结果是[8241]。 唯一仍然需要的是在Scrambled line上的值,如果存在:)无论如何,谢谢你。
大约 3 年之前 回复
douxuanjie2692
douxuanjie2692 当然,你的命令似乎与缓冲输出和超时一起使用,它不是一个静态流,所以你得到了那个错误
大约 3 年之前 回复
dqitk20644
dqitk20644 $ command ='timeout 2 /my_src/astra/./astra --analyze udp://p5p1.4@239.1.1.231:22231 | awk \'/ Bitrate / {printf“%d”,$ 6} / Scrambled / {for(i = 6; i <= NF; i ++)'。 'printf“%d”,substr($ i,1,index($ i,“=”))} \''; 此返回[log]无法写入stdout [Broken pipe]。 源命令返回(所有行)pastebin.com/zjWKQsaD
大约 3 年之前 回复
dongtang1910
dongtang1910 在开始时,运行您的命令| shell中的myawk(没有文件名),并确保它返回结果
大约 3 年之前 回复
douhui5529
douhui5529 嗨,谢谢你快速回答我的问题! 我理解logik,但是,我没有使用文件。 我需要什么命令分析| awk,我使用此代码而不是结果的traynig。 我可以更容易地将一个变量与特定分隔符一起使用。 示例结果8241#250,251,252,253
大约 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐