Solo obtengo la geometría H + W de mi pantalla sin la posterior + x + y


9

Estoy leyendo este artículo . Hay una declaración allí que dice:

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 

Cuando ejecuto el comando me sale un error con la sección que dice:

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

La razón es que cuando usa este comando en mi computadora, genera:

1360x768+0+0 

¿Cómo elimino la última parte de la salida de resolución de pantalla en 1360x768lugar de 1360x768+0+0?


1
Si conoce la geometría, 1360x768, simplemente use en lugar de una variable
Panther

1
Me doy cuenta de esto, y ya lo hice de esta manera con éxito. Pero también estaba tratando de usar la experiencia para aumentar mi conocimiento de awk. :)
Guest123ABC

OK buena suerte. Hay varios tutoriales excelentes en awk en internet.
Pantera

Respuestas:


10
  • Puede usar perlpara obtener solo la resolución:

    xwininfo -root | perl -lne 's/.*geometry (\w+).*/$1/ or next; print'
    1360x768
    
  • O incluso más corto con solo GNU grep:

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

    Explicación : La mirada retrospectiva (?<=geometry )afirma que, en la posición actual de la cadena, lo que precede son los caracteres "geometría". Si la afirmación tiene éxito, el motor coincide con el patrón de resolución.

    Una mirada atrás no "consume" ningún carácter en la cadena. Esto significa que después del paréntesis de cierre, el motor regex se queda parado en el mismo lugar en la cadena desde la que comenzó a buscar: no se ha movido. Desde esa posición, el motor puede comenzar a emparejar caracteres nuevamente.

    Fuente: http://www.rexegg.com/regex-disambiguation.html#lookbehind


@ Guest123ABC He actualizado mi respuesta con una versión más corta de la expresión regular
Sylvain Pineau, el

6

Mi awkenfoque puro , dividir la cadena en campos basados ​​en espacios y signos más:

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

Un método similar a la expresión Perl de Sylvain pero con sed:

xwininfo -root | sed -nr 's/.*geometry ([0-9x]+).*/\1/p'

5

Tal vez podrías usar awk substr. En tu caso particular:

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

O si quieres que funcione en cualquier caso:

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

espero que esto ayude.


¡Oh si! ¡Muchas gracias! ¡El primero funcionó! :) El segundo produce dos resultados: un 1 y luego la resolución que no funcionaría en este caso, pero sigue siendo una declaración genial para el conocimiento general.
Guest123ABC

2
deberías usar la respuesta de sylvain. Es mejor.
Reliquia

1
He movido la parte grep al comando awk (porque no puedo evitarlo). El problema con substr es que usa ubicaciones fijas. Resoluciones como 1000x1000 lo romperán porque son demasiado largas.
Oli

@Oli wow buen movimiento. No me olvidaré de ese reemplazo grep. Gracias por los consejos. Tienes toda la razón sobre el substr, por eso agregué el segundo comando.
Reliquia del

2

Otros ya han proporcionado respuestas para la operación completa, pero solo para responder ¿Cómo llego de 1360x768+0+0a 1360x768? entonces recomendaría usar cutcomo la solución más simple posible, por ejemplo

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

1

También probé ejemplos de captura de pantalla de línea de comandos hace unas semanas. Como solución alternativa puedes usar

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

para detectar la resolución de pantalla.

Para capturar la pantalla con audio interno y micrófono, puede usar

 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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.