Только получить H + W геометрию моего экрана без более поздних + x + y

9

Я читаю эту статью . Там есть утверждение, которое гласит:

ffmpeg -f alsa -ac 2 -i hw:0,0 -f x11grab -s $(xwininfo -root | grep 'geometry' | awk '{print $2;}') -r 25 -i :0.0 -sameq -f mpeg -ar 48000 -s wvga -y sample.mp4 

Когда я запускаю команду, я получаю сообщение об ошибке с разделом:

xwininfo -root | grep 'geometry' | awk '{print $2;}' 

Причина в том, что когда вы используете эту команду на моем компьютере, она выводит:

1360x768+0+0 

Как убрать последнюю часть вывода разрешения экрана 1360x768вместо 1360x768+0+0?

Guest123ABC
источник
1
Если вы знаете геометрию, 1360x768, просто используйте вместо переменной
Panther
1
Я понимаю это, и уже сделал это успешно. Но я пытался использовать этот опыт, чтобы увеличить свои знания по awk. :)
Guest123ABC
Хорошо, удачи. В интернете есть несколько отличных уроков по awk.
Пантера

Ответы:

10
  • Вы можете использовать, perlчтобы получить только разрешение:

    xwininfo -root | perl -lne 's/.*geometry (\w+).*/$1/ or next; print'
    1360x768
    
  • Или даже короче только с GNU grep:

    xwininfo -root | grep -oP '(?<=geometry )\w+'
    1360x768
    

    Объяснение : Lookhehind (?<=geometry )утверждает, что в текущей позиции в строке, что предшествует символам «геометрия». Если утверждение выполнено успешно, механизм соответствует шаблону разрешения.

    Вид сзади не «потребляет» никаких символов в строке. Это означает, что после закрывающей скобки движок регулярных выражений остается на том же месте строки, из которой он начал смотреть: он не двигался. С этой позиции двигатель может снова начать сопоставлять символы.

    Источник: http://www.rexegg.com/regex-disambiguation.html#lookbehind

Сильвен Пино
источник
@ Guest123ABC Я обновил свой ответ более короткой версией регулярного выражения
Сильвен Пино,
6

Мой чистый awkподход, разбивая строку на поля на основе пробелов и знаков плюс:

xwininfo -root | awk -F'[+| ]' '/geometry/ {print $4}'

Метод, подобный Perl-выражению Сильвена, но с sed:

xwininfo -root | sed -nr 's/.*geometry ([0-9x]+).*/\1/p'
Оли
источник
5

Вы могли бы использовать awk substr. В вашем конкретном случае:

xwininfo -root | awk '/geometry/ {print substr($2,1,8);}'

Или, если вы хотите, чтобы это работало в любом случае:

xwininfo -root | awk '/geometry/ {print $2;}' | cut -d'+' -f1

надеюсь, это поможет.

реликвия
источник
О да! Большое спасибо! Первый работал! :) Второй дает два результата: 1 и затем разрешение, которое не сработает в этом случае, но все же классное утверждение для общих знаний.
Guest123ABC
2
Вы должны использовать ответ от sylvain. это лучше.
Relic
1
Я переместил часть grep в команду awk (потому что я ничего не могу с собой поделать). Проблема с substr в том, что он использует фиксированные места размещения. Разрешения, такие как 1000x1000, сломают его, потому что они слишком длинные.
Оли
@ Оли вау, хороший ход. я не забуду об этой замене. Спасибо за советы. Вы абсолютно правы в отношении substr, поэтому я добавил вторую команду.
Реликвия
2

Другие уже предоставили ответы для всей операции, но только для ответа. Как мне добраться 1360x768+0+0до 1360x768? тогда я бы рекомендовал использовать cutкак самое простое решение, например,

$ echo 1360x768+0+0 | cut -d+ -f1
1360x768
$
hlovdal
источник
1

Я также попробовал примеры захвата экрана командной строки несколько недель назад. В качестве альтернативного решения вы можете использовать

 xdpyinfo  | grep dimensions | awk -F ' ' ' { print $2 } ' 

для определения разрешения экрана.

Для захвата экрана с внутренним звуком и микрофоном, вы можете использовать

 avconv -f   pulse -i default -f x11grab -r 15 -s $(xdpyinfo  | grep dimensions | awk -F ' ' ' { print $2 } ' ) -i :0.0+0,0 -acodec libmp3lame -vcodec libx264  $(date +"%m%d%Y_%H%M%S_$HOSTNAME")_screencast.mp4
кенна
источник