- 主题:grep里的正则问题
我的某个命令cmd的输出是:
Duration: 00:01:16.73, start: 0.000000, bitrate: 1676 kb/s
Stream #0:0(und): Video: h264 (avc1 / 0x31637661), none(tv, bt709), 1280x720, 1618 kb/s, 30 fps, 30 tbr, 12800 tbn, 12800 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 48 kb/s (default)
我想获取到的是其中的1280x720中的720这个数,不知应该怎么做呢?
我现在是用
cmd 2>&1 | grep "Stream #0:0" | grep -oe "\d\{3,\}x\d\{3,\}"
得到了1280x720,然后不知怎么做了……
--
FROM 218.19.138.*
再上一个 awk -F 'x' '{print $2}' 可以实现,但感觉是不是走了条远路
【 在 anhnmncb 的大作中提到: 】
: 我的某个命令cmd的输出是:
: Duration: 00:01:16.73, start: 0.000000, bitrate: 1676 kb/s
: Stream #0:0(und): Video: h264 (avc1 / 0x31637661), none(tv, bt709), 1280x720, 1618 kb/s, 30 fps, 30 tbr, 12800 tbn, 12800 tbc (default)
: ...................
--
FROM 218.19.138.*
echo "Stream #0:0(und): Video: h264 (avc1 / 0x31637661), none(tv, bt709), 1280x720, 1618 kb/s, 30 fps, 30 tbr, 12800 tbn, 12800 tbc (default)" | grep -Po "(?<=x)\\d+(?=,)"
720
--
FROM 222.212.186.*
谢谢,得用到-P啊,但-P有一些平台的grep不支持这个参数……
【 在 poocp 的大作中提到: 】
: echo "Stream #0:0(und): Video: h264 (avc1 / 0x31637661), none(tv, bt709), 1280x720, 1618 kb/s, 30 fps, 30 tbr, 12800 tbn, 12800 tbc (default)" | grep -Po "(?<=x)\\d+(?=,)"
: 720
--
FROM 218.19.138.*
需要支持全平台可以用python
【 在 anhnmncb 的大作中提到: 】
: 谢谢,得用到-P啊,但-P有一些平台的grep不支持这个参数……
--
FROM 222.212.186.*
断言是需要 -P
【 在 anhnmncb 的大作中提到: 】
: 我的某个命令cmd的输出是:
: Duration: 00:01:16.73, start: 0.000000, bitrate: 1676 kb/s
: Stream #0:0(und): Video: h264 (avc1 / 0x31637661), none(tv, bt709), 1280x720, 1618 kb/s, 30 fps, 30 tbr, 12800 tbn, 12800 tbc (default)
: ...................
--
FROM 117.174.28.*
| grep -o '[0-9]\+$'
【 在 anhnmncb 的大作中提到: 】
: 我的某个命令cmd的输出是:
: Duration: 00:01:16.73, start: 0.000000, bitrate: 1676 kb/s
: Stream #0:0(und): Video: h264 (avc1 / 0x31637661), none(tv, bt709), 1280x720, 1618 kb/s, 30 fps, 30 tbr, 12800 tbn, 12800 tbc (default)
: ...................
--
FROM 116.7.169.*
shell 的风格就是不要用一个工具解决所有的问题,所以这种一般都是 sed tr grep awk cut 一起上。
如果追求一个命令搞定一切,可以用 perl,大多数系统也都有预装。
我当初学习 Perl 就是因为两个原因:
1,一个命令搞定一切,总感觉比多个命令效率更高一些
2,Perl 的跨平台支持也比 shell 命令好一些,正则表达式也不用学那么多套
zsh > ffmpeg -hide_banner -i 三教极简史.mkv 2>&1 | perl -lne 'print $1 if /Stream.*\d+x(\d+)/'
1080
实测没问题。
【 在 anhnmncb 的大作中提到: 】
: 我的某个命令cmd的输出是:
: Duration: 00:01:16.73, start: 0.000000, bitrate: 1676 kb/s
: Stream #0:0(und): Video: h264 (avc1 / 0x31637661), none(tv, bt709), 1280x720, 1618 kb/s, 30 fps, 30 tbr, 12800 tbn, 12800 tbc (default)
: Metadata:
: handler_name : VideoHandler
: Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 48 kb/s (default)
: 我想获取到的是其中的1280x720中的720这个数,不知应该怎么做呢?
: 我现在是用
: cmd 2>&1 | grep "Stream #0:0" | grep -oe "\d\{3,\}x\d\{3,\}"
: 得到了1280x720,然后不知怎么做了……
--
修改:flw FROM 27.38.197.*
FROM 27.38.197.*
谢谢,在知道还有支持-P的grep前,我知道可通过3次grep,或1次grep+1次awk实现我的需求。
然后因为强迫症原因,在想是不是因为我对正则了解不多,所以本来1次grep就能实现的事我用了3次grep;而两步的方案grep+awk,我又在想,这调用1次的awk的开销,是不是会比调用2次的grep还大……
【 在 flw 的大作中提到: 】
: 标 题: Re: grep里的正则问题
: 发信站: 水木社区 (Sat May 14 23:01:56 2022), 站内
:
: shell 的风格就是不要用一个工具解决所有的问题,所以这种一般都是 sed tr grep awk cut 一起上。
: 如果追求一个命令搞定一切,可以用 perl,大多数系统也都有预装。
: 我当初学习 Perl 就是因为两个原因:
: 1,一个命令搞定一切,总感觉比多个命令效率更高一些
: 2,Perl 的跨平台支持也比 shell 命令好一些,正则表达式也不用学那么多套
:
: zsh > ffmpeg -hide_banner -i 三教极简史.mkv 2>&1 | perl -lne 'print $1 if /Stream.*\d+x(\d+)/'
: 1080
:
: 实测没问题。
:
: 【 在 anhnmncb 的大作中提到: 】
: : 我的某个命令cmd的输出是:
: : Duration: 00:01:16.73, start: 0.000000, bitrate: 1676 kb/s
: : Stream #0:0(und): Video: h264 (avc1 / 0x31637661), none(tv, bt709), 1280x720, 1618 kb/s, 30 fps, 30 tbr, 12800 tbn, 12800 tbc (default)
: : Metadata:
: : handler_name : VideoHandler
: : Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 48 kb/s (default)
: : 我想获取到的是其中的1280x720中的720这个数,不知应该怎么做呢?
: : 我现在是用
: : cmd 2>&1 | grep "Stream #0:0" | grep -oe "\d\{3,\}x\d\{3,\}"
: : 得到了1280x720,然后不知怎么做了……
:
: --
:
: ※ 修改:·flw 于 May 14 23:02:28 2022 修改本文·[FROM: 27.38.197.*]
: ※ 来源:·水木社区 mysmth.net·[FROM: 27.38.197.*]
--
修改:flw FROM 27.38.197.*
FROM 119.34.17.*
很显然用的命令越多,对单个命令的功能性要求越低,
用的命令越少,就对单个命令的功能要求越高。
所以,简单的 grep 和其它命令的组合,可以搞定。
或者 1 次 awk 或者 1 次 perl,也可以搞定。
甚至于如果 grep 支持断言的话,一个命令也可以搞定。
但是对命令的功能要求越多,那可移植性就越差。
毕竟这些文本处理工具不同的 OS 不同的版本之间差别确实不小,
而且学习起来成本也不低。
perl 相对综合成本低一些,收益高一些,跨平台的时候稳定一些。
正则表达式功能更全一些,语法更优雅一些。
【 在 anhnmncb 的大作中提到: 】
: 谢谢,在知道还有支持-P的grep前,我知道可通过3次grep,或1次grep+1次awk实现我的需求。
: 然后因为强迫症原因,在想是不是因为我对正则了解不多,所以本来1次grep就能实现的事我用了3次grep;而两步的方案grep+awk,我又在想,这调用1次的awk的开销,是不是会比调用2次的grep还大……
--
FROM 27.38.197.*