รับเรขาคณิต 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
ฉันเข้าใจสิ่งนี้และทำสิ่งนี้สำเร็จแล้ว แต่ฉันพยายามใช้ประสบการณ์เพื่อเพิ่มความรู้ให้ฉันด้วย :)
Guest123ABC

โอเคโชคดี มีบทเรียนที่ยอดเยี่ยมหลายอย่างเกี่ยวกับ awk บนอินเทอร์เน็ต
Panther

คำตอบ:


10
  • คุณสามารถใช้perlเพื่อรับความละเอียดเท่านั้น:

    xwininfo -root | perl -lne 's/.*geometry (\w+).*/$1/ or next; print'
    1360x768
    
  • หรือสั้นกว่าด้วย GNU เพียงgrep:

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

    คำอธิบาย : lookbehind (?<=geometry )ยืนยันว่าที่ตำแหน่งปัจจุบันในสตริงสิ่งที่นำหน้าคือตัวอักษร "เรขาคณิต" หากการยืนยันสำเร็จเครื่องยนต์ตรงกับรูปแบบความละเอียด

    lookbehind ไม่ "ใช้" อักขระใด ๆ บนสตริง ซึ่งหมายความว่าหลังจากวงเล็บปิดเอ็นจิน regex ยังคงยืนอยู่บนจุดเดียวกันในสตริงที่มันเริ่มมองหา: มันไม่ได้เคลื่อนที่ จากตำแหน่งนั้นเครื่องยนต์สามารถเริ่มจับคู่อักขระอีกครั้ง

    ที่มา: http://www.rexegg.com/regex-disambiguation.html#lookbehind


@ Guest123ABC ฉันได้อัปเดตคำตอบของฉันด้วยนิพจน์ทั่วไปที่สั้นกว่า
Sylvain Pineau

6

awkวิธีการที่บริสุทธิ์ของฉันแยกสตริงลงในฟิลด์ตามช่องว่างและเครื่องหมายบวก:

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

วิธีการคล้ายกับการแสดงออก Perl ของ Sylvain แต่ด้วย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 และจากนั้นความละเอียดที่ไม่สามารถใช้งานได้ในกรณีนี้ แต่ยังคงเป็นคำสั่งที่ยอดเยี่ยมสำหรับความรู้ทั่วไป
บุคคลทั่วไป 123ABC

2
คุณควรใช้คำตอบจาก sylvain มันดีกว่า
ระลึก

1
ฉันย้ายส่วน grep ไปเป็นคำสั่ง awk (เพราะฉันไม่สามารถช่วยตัวเองได้) ปัญหาของ substr คือการใช้ตำแหน่งคงที่ ความละเอียดเช่น 1000x1000 จะทำลายเพราะยาวเกินไป
Oli

@Oli ว้าวย้ายที่ดี ฉันจะไม่ลืมเกี่ยวกับการแทนที่ grep นั้น ขอบคุณสำหรับเคล็ดลับ คุณพูดถูกเกี่ยวกับ substr นี่คือเหตุผลที่ฉันเพิ่มคำสั่งที่สอง
ระลึก

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.