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, btw를 사용할 때는 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+'출력 abcde하지만 echo '012abcde' | grep -oP '(?<=\d+)\w+'오류를 출력합니다 grep: lookbehind assertion is not fixed length. 따라서그렙템플릿긍정적인ookbehind는 또는 가 (?<=fixed_length_pattern)pattern아닙니다 .(?<=pattern)pattern(?<=text)pattern

(2)에 따르면@G-Man은 '모니카를 복원하라'고 말합니다.아래 주석 섹션에서 옵션은 다음 -oGrep같습니다.아니다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번째가 아닌 3번째 필드에 있습니다.

답변4

xrandr | grep '*' | awk '{print $1}'

이것은 나에게 가장 간단한 해결책처럼 보였습니다. 저는 두 개의 모니터를 가지고 있고 둘 다에 대한 출력을 얻습니다.

관련 정보