如何从 xrandr 输出中仅提取屏幕分辨率信息?

如何从 xrandr 输出中仅提取屏幕分辨率信息?
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)pattern1 Positive Lookbehind:检查 是否text出现在模式之前。

[ ]字符集。用于将字符列表分组在一起。

\d一个数字。表示范围0-9

[x\d]团体\dx一起。表示数字和 x 的列表。这基本上意味着这个x0123456789

+匹配前一组中的一个或多个。

因此,(?<=primary )[x\d]+基本意味着匹配字符列表x0123456789例如1920x1080)出现在文本之后'primary '。请注意,' '后面有一个空格字符primary。只有在你的情况下这样的匹配才会是1920x1080

你可以测试这个正则表达式这里

编辑:重要笔记。

(1) 通过Grep,您可以仅有的使用固定长度的lookbehind。例如echo '012abcde' | grep -oP '(?<=\d{3})\w+'输出abcdeecho '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}'

这对我来说似乎是最简单的解决方案,我有两个显示器并获得两个显示器的输出。

相关内容