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할 수 있습니다오직고정 길이의 뒤돌아보기를 사용하세요. 예를 들어 echo '012abcde' | grep -oP '(?<=\d{3})\w+'출력은 되지만 abcde출력 echo '012abcde' | grep -oP '(?<=\d+)\w+'이 잘못되었습니다 grep: lookbehind assertion is not fixed length. 따라서grep주형긍정적인ookbehind 는 또는 가 (?<=fixed_length_pattern)pattern아닙니다 .(?<=pattern)pattern(?<=text)pattern

(2) 기준@G-Man이 "모니카 복원"이라고 말합니다.아래 댓글 섹션의 -o옵션은 Grep다음과 같습니다.아니요POSIX 표준을 준수합니다. 이는 사용 가능한 오래된 장비가 많지 않을 수 있음을 의미합니다. 하지만 제 개인적인 경험에 따르면 최근 4년 이내에 업데이트된 기기는 정상적으로 작동할 것입니다. 다른 장치도 작동할 수 있습니다. 테스트할 장치가 많지 않기 때문에 더 구체적으로 설명할 수 없습니다.

(3) 다시 바탕으로G-맨-P는 PCRE(Perl-Compatible Regular Expression) 지원 매개변수를 전달할 때 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}'

이것은 나에게 가장 간단한 해결책인 것 같습니다. 저는 두 개의 모니터를 가지고 있고 두 모니터 모두에서 출력을 얻습니다.

관련 정보