Uzyskaj tylko geometrię H + W mojego ekranu bez późniejszego + x + y

9

Czytam ten artykuł . Jest tam takie oświadczenie:

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 

Po uruchomieniu polecenia pojawia się błąd z sekcją:

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

Powodem jest to, że kiedy użyjesz tego polecenia na moim komputerze, wyświetla on:

1360x768+0+0 

Jak usunąć ostatnią część wyjścia rozdzielczości ekranu 1360x768zamiast 1360x768+0+0?

Guest123ABC
źródło
1
Jeśli znasz geometrię 1360 x 768, użyj raczej zmiennej
Panther
1
Zdaję sobie z tego sprawę i już tak zrobiłem. Ale starałem się wykorzystać to doświadczenie do zwiększenia mojej wiedzy na temat awk. :)
Guest123ABC
Dobrze, powodzenia. Istnieje kilka doskonałych samouczków na temat awk w Internecie.
Panther

Odpowiedzi:

10
  • Możesz użyć, perlaby uzyskać tylko rozdzielczość:

    xwininfo -root | perl -lne 's/.*geometry (\w+).*/$1/ or next; print'
    1360x768
    
  • Lub nawet krócej za pomocą samego GNU grep:

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

    Objaśnienie : Lookbehind (?<=geometry )zapewnia, że ​​w bieżącej pozycji w łańcuchu poprzedzają znaki „geometria”. Jeśli asercja się powiedzie, silnik pasuje do wzorca rozdzielczości.

    Lookbehind nie „zużywa” żadnych znaków w ciągu. Oznacza to, że po nawiasie zamykającym silnik regex pozostaje w tym samym miejscu w ciągu, od którego zaczął szukać: nie ruszył się. Z tej pozycji silnik może ponownie zacząć pasować znaki.

    Źródło: http://www.rexegg.com/regex-disambiguation.html#lookbehind

Sylvain Pineau
źródło
@ Guest123ABC Zaktualizowałem swoją odpowiedź krótszą wersją wyrażenia regularnego
Sylvain Pineau,
6

Moje czyste awkpodejście, dzielenie łańcucha na pola oparte na spacjach i znakach plus:

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

Podobna metoda do wyrażenia Perla Sylvaina, ale z sed:

xwininfo -root | sed -nr 's/.*geometry ([0-9x]+).*/\1/p'
Oli
źródło
5

Możesz użyć awk substr. W twoim konkretnym przypadku:

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

Lub jeśli chcesz, aby działało:

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

Mam nadzieję, że to pomoże.

Relikt
źródło
O tak! Dziękuję Ci bardzo! Pierwszy zadziałał! :) Drugi daje dwa wyniki: 1, a następnie rozdzielczość, która nie działałaby w tym przypadku, ale nadal jest fajnym stwierdzeniem dla ogólnej wiedzy.
Guest123ABC
2
powinieneś użyć odpowiedzi od sylvaina. jest ładniej.
Relikt
1
Przenieśliłem część grep do polecenia awk (ponieważ nie mogę się powstrzymać). Problem z podłożem polega na tym, że używa on stałych miejsc docelowych. Rozdzielczość takie jak 1000 x 1000 spowodują uszkodzenie, ponieważ są za długie.
Oli
@Oli wow miły ruch. nie zapomnę o zastąpieniu grep. Dzięki za wskazówki. Masz całkowitą rację co do substr, dlatego dodałem drugie polecenie.
Relikt
2

Inni już udzielili odpowiedzi na całą operację, ale aby odpowiedzieć tylko Jak się dostać 1360x768+0+0do 1360x768? wtedy poleciłbym cutjako najprostsze możliwe rozwiązanie, np

$ echo 1360x768+0+0 | cut -d+ -f1
1360x768
$
hlovdal
źródło
1

Kilka tygodni temu próbowałem również przechwytywać zrzuty ekranu z wiersza poleceń. Jako alternatywne rozwiązanie możesz użyć

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

do wykrywania rozdzielczości ekranu.

Aby przechwycić ekran z wewnętrznym dźwiękiem i mikrofonem, możesz użyć

 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
kenn
źródło