Só obtenho a geometria H + W da minha tela sem os últimos x + y

9

Estou lendo este artigo . Existe uma declaração que diz:

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 

Quando executo o comando, recebo um erro na seção que diz:

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

O motivo é que, quando você usa esse comando no meu computador, ele gera:

1360x768+0+0 

Como removo a última parte da saída da resolução da tela em 1360x768vez de 1360x768+0+0?

Guest123ABC
fonte
1
Se você conhece a geometria, 1360x768, basta usar em vez de uma variável
Panther
1
Eu percebo isso, e já fiz dessa maneira com sucesso. Mas eu estava tentando usar a experiência para aumentar meu conhecimento do awk também. :)
Guest123ABC
OK boa sorte. Existem vários tutoriais excelentes sobre o awk na internet.
Panther

Respostas:

10
  • Você pode usar perlpara obter apenas a resolução:

    xwininfo -root | perl -lne 's/.*geometry (\w+).*/$1/ or next; print'
    1360x768
    
  • Ou ainda mais curto com apenas o GNU grep:

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

    Explicação : O lookbehind (?<=geometry )afirma que, na posição atual na sequência, o que precede são os caracteres "geometria". Se a afirmação for bem-sucedida, o mecanismo corresponderá ao padrão de resolução.

    Um lookbehind não "consome" nenhum caractere na string. Isso significa que, após o fechamento dos parênteses, o mecanismo regex é deixado no mesmo local na string a partir da qual ele começou a procurar: ele não se moveu. A partir dessa posição, o mecanismo poderá iniciar a correspondência de caracteres novamente.

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

Sylvain Pineau
fonte
@ Guest123ABC Eu atualizei a minha resposta com uma versão mais curta da expressão regular
Sylvain Pineau
6

Minha awkabordagem pura , dividindo a string em campos com base em espaços e sinais de adição:

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

Um método semelhante à expressão Perl de Sylvain, mas com sed:

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

Você talvez possa usar awk substr. No seu caso particular:

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

Ou se você quiser que ele funcione em qualquer caso:

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

Espero que isso ajude.

Relíquia
fonte
Ai sim! Muito obrigado! O primeiro funcionou! :) O segundo produz dois resultados: um 1 e, em seguida, a resolução que não funcionaria nesse caso, mas ainda assim uma declaração interessante para o conhecimento geral.
Guest123ABC
2
você deve usar a resposta de sylvain. é melhor.
Relic
1
Mudei a parte grep para o comando awk (porque não consigo me conter). O problema com o substr é que ele usa canais fixos. Resoluções como 1000 x 1000 a interromperão porque são muito longas.
Oli
@ Oli uau movimento agradável. não esquecerei essa substituição grep. Obrigado pelas dicas. Você está totalmente certo sobre o substr, é por isso que adicionei o segundo comando.
Relic
2

Outros já forneceram respostas para a operação completa, mas para responder apenas Como faço para ir 1360x768+0+0para 1360x768? recomendo usar cutcomo a solução mais simples possível, por exemplo

$ echo 1360x768+0+0 | cut -d+ -f1
1360x768
$
hlovdal
fonte
1

Também tentei exemplos de captura de tela de linha de comando há algumas semanas. Como uma solução alternativa, você pode usar

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

para detectar a resolução da tela.

Para capturar a tela com áudio e microfone interno, você pode 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
Kenn
fonte