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ここでは and の組み合わせが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 を使うsedsed

例えば

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のIP:PORTの組み合わせのみを印刷することを保証するオプションgrep。この-m1オプションは、grep探している項目が見つかった場合にプロンプ​​トに戻ることを保証します(つまり、最初の一致から終了)。この-PオプションはPerl正規表現構文の使用を示します。
  • プログラムはqemu完了するまでバックグラウンドで実行されます。コマンドが終了するqemuと、stdout / stderrのすべての出力が失われますが、grepIP:PORTの組み合わせが最後の出力である必要があるため、心配する必要はありません。

上記のコマンドの出力をキャプチャするには、$(...)次のようにコマンドの代わりにラップします。

ip_port=$( grep ...etc )

関連情報