xrandr | grep primary
返回
eDP-1-1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 344mm x 193mm
我只对解析子串 1920x1080
从这个输出。
我该如何提取它?
答案1
$ echo 'eDP-1-1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 344mm x 193mm' |
awk -F'[ +]' '{print $4}'
1920x1080
使用 awk 时不需要 grep,顺便说一句,这就是您所需要的:
xrandr | awk -F'[ +]' '/primary/{print $4}'
答案2
只需运行这个,
xrandr | grep -oP '(?<=primary )[x\d]+'
这输出1920x1080
那么,这是如何运作的呢?
(?<=pattern)pattern
1 Positive Lookbehind:检查 是否text
出现在模式之前。
[ ]
字符集。用于将字符列表分组在一起。
\d
一个数字。表示范围0-9
[x\d]
团体\d
和x
一起。表示数字和 x 的列表。这基本上意味着这个x0123456789
+
匹配前一组中的一个或多个。
因此,(?<=primary )[x\d]+
基本意味着匹配字符列表x0123456789
(例如1920x1080)出现在文本之后'primary '
。请注意,' '
后面有一个空格字符primary
。只有在你的情况下这样的匹配才会是1920x1080
你可以测试这个正则表达式这里。
编辑:重要笔记。
(1) 通过Grep
,您可以仅有的使用固定长度的lookbehind。例如echo '012abcde' | grep -oP '(?<=\d{3})\w+'
输出abcde
但echo '012abcde' | grep -oP '(?<=\d+)\w+'
输出错误grep: lookbehind assertion is not fixed length
。因此,对于格雷普的模板磷积极的Lookbehind(?<=fixed_length_pattern)pattern
不是(?<=pattern)pattern
或(?<=text)pattern
。
(2) 根据@G-Man 说“恢复莫妮卡”在下面的评论部分中,-o
选项Grep
是不是符合 POSIX 标准。这意味着可能没有很多旧设备。不过,根据我个人的经验,最近 4 年更新的设备应该可以正常工作。其他设备也可能起作用。无法更具体,因为我没有那么多设备要测试。
(3) 再次根据G-曼-P
,当您传递启用 Perl 兼容正则表达式 (PCRE) 的参数时,支持 Lookbehind Assertion 。许多旧设备可能再次不支持这一点。但根据我的经验,在最近的设备上效果很好。
答案3
在这种特殊情况下,您可以使用cut
两次:
$ echo 'eDP-1-1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 344mm x 193mm' | cut -d ' ' -f4 | cut -d+ -f1
1920x1080
请注意,像这样的解析xrandr
输出非常脆弱。例如,在我的系统上,xrandr | grep primary
什么都不返回,分辨率位于第三个字段,而不是第四个字段。
答案4
xrandr | grep '*' | awk '{print $1}'
这对我来说似乎是最简单的解决方案,我有两个显示器并获得两个显示器的输出。