从 stdout/stderr 获取正在运行的程序的最后一句

从 stdout/stderr 获取正在运行的程序的最后一句

当我运行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

我会使用tailand 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 )

相关内容