如何更改 bash 代码以通过 xrandr 获取 ubuntu 上的屏幕分辨率,但不使用 awk?

如何更改 bash 代码以通过 xrandr 获取 ubuntu 上的屏幕分辨率,但不使用 awk?

以下 bash 代码可以很好地通过忽略 xrandr 来获取和回显屏幕的 x 和 y 分辨率:

您可以通过以下方式获取当前屏幕的分辨率:

通过运行获取 X 分辨率:

X=$(xrandr --current | grep '*' | uniq | awk '{print $1}' | cut -d 'x' -f1)

通过运行获取 Y 分辨率:

Y=$(xrandr --current | grep '*' | uniq | awk '{print $1}' | cut -d 'x' -f2)

通过运行以下命令输出 X 和 Y 分辨率:

echo "$X"x"$Y"

或者

echo "$X"
echo "$Y"

如何更改此代码以获取 ubuntu 上的屏幕分辨率,仍然通过看不见 xrandr,而无需使用 awk?

答案1

首先,真的没有理由删除awk。它非常快、稳定,并且是为这类事情而设计的。但是,你的命令不必要地复杂。你可以简单地这样做:

$ xrandr --current | awk '$2~/\*/{print $1}' 
2560x1440

如果你确实需要分别获取 x 和 y,请执行以下操作:

x=$(xrandr --current | awk '$2~/\*/{print $1}' | cut -d'x' -f1)
y=$(xrandr --current | awk '$2~/\*/{print $1}' | cut -d'x' -f2)
echo "$x"
echo "$y"

或者更简单地说:

$ read x y < <(xrandr --current | awk '$2~/\*/{sub(/x/," ");print $1,$2}')
$ echo "x:$x y:$y"
x:2560 y:1440

如果您坚持不使用 awk,这里还有其他几个选择:

read x y < <(xrandr --current | sed -En '/\*/{s/^ *([0-9]+)x([0-9]+).*/\1 \2/p}')
echo "$x"
echo "$y"

或者

read x y < <(xrandr --current | perl -lne 'print "$1 $2" if /^ *([0-9]+)x([0-9]+).*/')
echo "$x"
echo "$y"

或者

read x y < <(xrandr --current | grep -oP '\d+x\d+' | tr x ' ')
echo "$x"
echo "$y"

请注意,所有这些都假设只连接了一个屏幕,就像您的原始方法一样。

答案2

您可以使用二元运算符和read

[[ $(xrandr --current) \
    =~ current\ ([0-9]+)\ x\ ([0-9]+) \
]] && read x y <<< "${BASH_REMATCH[@]:1:2}"

echo ${x}x${y}

第二种变体使用当前模式创建一个步幅列表。

#!/bin/bash

a=()
while read -r; do
    [[ $REPLY \
    =~ \ +([0-9]+)x([0-9]+)\ +[0-9.]+\* ]] && a+=(${BASH_REMATCH[@]:1:2})
done < <(xrandr --current)

# print the first resolution.
read x y <<< ${a[@]::2} && echo ${x}x${y}

答案3

解析xrandr输出

在这个答案中我使用纯 bash。所有提出的解决方案都进行 xrandr 输出解析,而无需调用任何外部二进制文件(如awkgrep等)。

不要使用 grep 查找星号*,只需使用 grep 查找connected行即可:

xrandr --current | grep connected
VGA-1 disconnected (normal left inverted right x axis y axis)
DP-1 disconnected (normal left inverted right x axis y axis)
HDMI-1 connected primary 1920x1080+0+120 (normal left inverted right x axis y axis) 531mm x 299mm
DP-2 connected 1920x1200+1920+0 (normal left inverted right x axis y axis) 535mm x 339mm
HDMI-2 disconnected (normal left inverted right x axis y axis)

这显示哪个屏幕已连接以及他的目前的规模

显示屏幕

scnt=1
while IFS=' x+' read dev stat w h x y j _; do
    if [[ $stat == connected ]]; then
        typ=sec
        [[ $w == primary ]] &&
            typ=${w::3} w=$h h=$x x=$y y=$j
        printf '%3d: %-8s (%s) width:%5d height:%5d hoffset:%5d voffset:%5d\n' \
            $((scnt++)) $dev $typ $w $h $x $y
    fi
done < <(xrandr)
  1: HDMI-1   (pri) width: 1920 height: 1080 hoffset:    0 voffset:  120
  2: DP-2     (sec) width: 1920 height: 1200 hoffset: 1920 voffset:    0

或者完整解析显示和屏幕:

scnt=1
while read -r line; do
    case $line in 
        Screen*)
            line=${line#*current }
            IFS=' ,' read -r width _ height _ <<< "$line"
            printf '%-20swidth:%5d height:%5d\n' Whole\ display: $width $height
        ;;
        *\ connected\ *)
            IFS=' x+' read -r dev stat width height offx offy j _ <<< "$line"
            typ=sec
            [[ $width == primary ]] &&
                typ=${width::3} width=$height height=$offx offx=$offy offy=$j
            printf '%3d: %-8s (%s) width:%5d height:%5d hoffset:%5d voffset:%5d\n' \
                $((scnt++)) $dev $typ $width $height $offx $offy
        ;;
    esac
done < <(xrandr)

这将在我的主机上显示:

Whole display:      width: 3840 height: 1200
  1: HDMI-1   (pri) width: 1920 height: 1080 hoffset:    0 voffset:  120
  1: DP-2     (sec) width: 1920 height: 1200 hoffset: 1920 voffset:    0

相关内容