Отримайте лише 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?


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
    

    Пояснення : Позаду заперечення (?<=geometry )стверджується, що в поточному положенні рядка, що передує, є символи "геометрія". Якщо твердження вдається, двигун відповідає схемі роздільної здатності.

    Погляд, який знаходиться позаду, не "споживає" жодних символів на рядку. Це означає, що після закриття дужок, двигун регулярного виведення залишається стояти на тому самому місці в рядку, з якого він почав шукати: він не перемістився. З цього положення двигун може знову починати відповідати символи.

    Джерело: http://www.rexegg.com/regex-disambiguation.html#lookbehind


@ Guest123ABC Я оновив свою відповідь коротшою версією регулярного виразу
Sylvain Pineau,

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
вам слід скористатися відповіддю з мови. це приємніше.
Реліквія

1
Я перемістив частина grep в команду awk (тому що я не можу допомогти собі). Проблема з substr полягає в тому, що він використовує фіксовані місця розташування. Роздільна здатність, як-то 1000x1000, порушить її, оскільки вони занадто довгі.
Олі

@ Олі приємний хід. Я не забуду про цю заміну грепа. Дякую за поради. Ви абсолютно праві щодо субстрату, тому я додав другу команду.
Реліквія

2

Інші вже дали відповіді на повну операцію, але тільки відповісти Як я можу отримати від 1360x768+0+0до 1360x768? то я б рекомендував використовувати cutяк найпростіше можливе рішення, наприклад

$ echo 1360x768+0+0 | cut -d+ -f1
1360x768
$

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.