자체적으로 출력되는 출력을 지속적으로 읽고 행을 구문 분석합니다.

자체적으로 출력되는 출력을 지속적으로 읽고 행을 구문 분석합니다.

때때로 프로그램의 출력이 기본적으로 자신을 덮어쓰는 경우가 있습니다.
예를 들어 의 출력에는 dd if=(something) of=(something) status=progress다음과 같은 출력 모델이 있습니다.

56670413312 bytes (57 GB, 53 GiB) copied, 1938 s, 29.2 MB/s

그리고 새 줄을 인쇄하지 않고 값이 계속 변경됩니다(따라서 출력을 자체 덮어씁니다).

다음 스크립트를 사용하여 이 동작을 복제했습니다.

#!/bin/sh
# POSIX!

limit=50
i=1; while [ $i -le $limit ]; do
  echo -n "testing $i\r"
  i=$(($i + 1))
done

따라서 매초마다 추가 줄을 인쇄(추가)하지 않고 다음 줄이 현재 숫자로 대체됩니다.

testing <number>

문제는 이 출력을 지속적으로 관찰하여 정보를 구문 분석하고 처리할 수 있는 방법입니다.

예를 들어, 나는 dd의 출력을 가져와 어떤 방식으로든 구문 분석하여 특정 비율의 결론을 얻고 싶습니다. 비슷하다:

# This is the output model:
# 56670413312 bytes (57 GB, 53 GiB) copied, 1938 s, 29.2 MB/s

# Parsing the output
dd if=/dev/sda1 of=/dev/sdb1 status=progress | awk '{print $3}' | cut -d '(' -f 2 | awk '{print $1"GB concluded of 10000GB"}'

나는 적어도 인쇄 줄의 추가 내용을 표시하기를 바랐습니다.

1GB concluded of 10000GB
2GB concluded of 10000GB
...

그러나 대신 아무 일도 일어나지 않고 파이프에서 출력을 완전히 무시합니다.

이러한 경우 dd의 출력을 재현하려면 위 스크립트를 모델로 사용할 수 있습니다.

#!/bin/sh
limit=50
i=1; while [ $i -le $limit ]; do
  echo -n "56670413312 bytes ($i GB, 53 GiB) copied, 1938 s, 29.2 MB/s\r"
  i=$(($i + 1))
  sleep 1
done

내가 원하는 방식으로 출력을 일관되게 구문 분석하려면 어떻게 해야 합니까? (바람직하게는 POSIX에서)

관련 정보