当我运行qemu
命令时,我在底行看到一条消息,其中为我提供了 vncviewer 命令的 IP:PORT。
[mahmood@com[mahmood@compute-0-0 ~] qemu-system-x86_64 -m 4096 -hda win7_x64_snap.img -boot c -usbdevice tablet -enable-kvm -device e1000,netdev=host_files -netdev user,net=10.0.2.0/24,id=host_files,restrict=off
qemu-sqemu-system-x86_64: warning: host doesn't support requested feature: CPUID.80000001H:ECX.tbm [bit 21]
VNC server running on 127.0.0.1:5900
如何获得屏幕上打印的最后一行?所以我提取了最后一部分127.0.0.1:5900
。
答案1
由于 qemu 是一个长时间运行的程序,并且它不会返回到提示符,因此打开另一个终端并检查 qemu 正在使用哪个 IP:PORT 会更容易。所以,命令是
$ netstat -tulpn | grep qemu-system | awk '{print $4}'
127.0.0.1:5900
感谢您的建议。
答案2
grep
和的组合cut
在这里很有用。
您可以使用以下命令提取最后一行
grep -m1 'VNC server running on'
该-m1
标志意味着 grep 将在第一个匹配后停止读取,因为这可能是一个长时间运行的过程。
然后你可以用以下命令剪下地址
cut -d' ' -f5
如果您希望将输出通过管道传输到另一个进程,您可能希望qemu
在后台启动,如下所示:
(qemu-system-x86_64... &) | grep -m1 'VNC server running on' | cut -d' ' -f5
答案3
我会使用tail
and sed
,或者只是sed
例如
address=$(the_above_command | sed -r -e 's/VNC server running on ([0-9.:]+)$/\1/')
echo "$address" #or some other command
测试中的位,()
看看它是否能满足您的需求。是$(cmd)
一个替换,它采用 的标准输出cmd
,并用此输出替换自身。然后重新解析该行。
注意:如果程序正在运行/继续运行,那么你无法知道当前行是否是最后一行。幸运的是,我认为您不必知道这是最后一行。
答案4
这应该有效:
grep -m1 -oP '(\d{1,3}\.?){4}:\d{1,5}' <( your-qemu-command 2>&1 )
<( your-qemu-command 2>&1 )
是一个进程替换,启动qemu
时 stdout/stderr 重定向到匿名管道或 FIFO;grep
从管道/FIFO 中读取,粗略地查找模式 IP:PORT,其中 IP 指的是 IPv4 地址。-o
确保grep
只打印匹配行的 IP:PORT 组合的选项;该-m1
选项确保grep
一旦找到要查找的内容(即在第一次匹配时退出),就会返回到提示符。该-P
选项指示使用 Perl 正则表达式语法。- 请注意,该程序
qemu
将在后台运行直至完成。命令qemu
终止后stdout/stderr 上的任何输出grep
都会丢失,但由于 IP:PORT 组合应该是最后的输出,因此不必担心。
如果您想捕获上述命令的输出,只需将其包装在命令替换中,$(...)
如下所示:
ip_port=$( grep ...etc )