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 를 사용 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의 IP:PORT 조합만 인쇄되도록 보장하는 옵션 grep입니다. 이 -m1옵션은 grep찾고 있는 항목이 발견되면 프롬프트로 돌아가도록 보장합니다(즉, 첫 번째 일치 항목에서 종료). 이 -P옵션은 Perl 정규식 구문의 사용을 나타냅니다.
  • 프로그램은 qemu완료될 때까지 백그라운드에서 실행됩니다. 명령이 종료 qemu되면 stdout/stderr의 모든 출력이 손실되지만 grepIP:PORT 조합이 마지막 출력이어야 하므로 걱정할 필요가 없습니다.

위 명령의 출력을 캡처하려면 $(...)다음과 같이 명령 대체로 래핑하면 됩니다.

ip_port=$( grep ...etc )

관련 정보