'dd'에서 awk/sed/grep으로 출력 보내기

'dd'에서 awk/sed/grep으로 출력 보내기

내 컴퓨터의 쓰기 속도를 추정하기 위해 dd를 사용하려고 합니다.

dd if=/dev/urandom of=/dev/null bs=1K count=10000

다음과 같은 출력을 제공합니다

10000+0 records in
10000+0 records out
10240000 bytes (10 MB) copied, 0.746313 s, 13.7 MB/s

bash 변수에 "13.7MB/s"를 어떻게 넣나요? dd의 출력을 awk, sed, grep과 같은 프로그램에 파이프로 연결해 보았지만 소용이 없었습니다.

os.system(...)궁극적으로 Python 스크립트를 통해 호출합니다. Python에서 비슷한 결과를 얻을 수 있는 보다 직접적인 방법을 아는 사람이 있다면 나도 그 방법에 관심이 있을 것입니다. 파일 크기를 기준으로 파일 복사에 걸리는 시간을 예측하려고 합니다.

어떤 도움이라도 대단히 감사하겠습니다.

답변1

문제는 . STDERR대신 dd의 출력을 지정하여 . 뿐만 아니라 STDOUT리디렉션도 수행해야 한다는 것입니다 .STDERRSTDOUT

|&bash 및 zsh의 경우 이것을 대신 사용할 수 있으며 , 이는 두 번째 명령 으로 |도 리디렉션됩니다 . 예:STDERRSTDIN

dd if=/dev/urandom of=/dev/null bs=1K count=10000 |& awk '/copied/ {print $8 " "  $9}'

보다 일반적인 접근 방식은 STDERR의 명시적인 리디렉션을 사용하는 것입니다 2>&1. 예를 들면 다음과 같습니다.

dd if=/dev/urandom of=/dev/null bs=1K count=10000 2>&1 | awk '/copied/ {print $8 " "  $9}'

Python 부분의 경우 subprocess 모듈을 확인하고Popen특히.

답변2

var=$(dd if=/dev/urandom of=/dev/null bs=1K count=10000 2>&1)
var=$(echo ${var##*,})

답변3

타격 이후매개변수 확장1_CR에서 제안한 훌륭하고 우아한 솔루션인 외부 명령을 사용하지 마십시오.

그러나 그의 제안은 잘못된 값을 반환합니다(즉, 쉼표 뒤의 값만 반환).

$ var=$(dd if=/dev/urandom of=/dev/null bs=1K count=10000 2>&1)
$ var=$(echo ${var##*,})
$ echo $var
8 MB/s # the wrong value

다음과 같은 정답이 제공됩니다.

$ var=$(dd if=/dev/urandom of=/dev/null bs=1K count=10000 2>&1)
$ var=$(echo ${var##*s,})
$ echo $var
11,8 MB/s # the right value

답변4

테마의 또 다른 변형으로, 모든 관련 필드를 가져오고 awk 또는 sed에 대한 외부 호출을 피합니다(bash에 내장된 read 사용).

IFS=' +' read in_full in_part _x _x \
out_full out_part _x _x \
bytes _x _x _x _x seconds _x speed speed_units < <(
  echo $(dd if=/dev/zero of=/dev/null bs=1024 count=7 2>&1) 
)

echo -e "$bytes bytes were read in $seconds seconds, speed was $speed $speed_units.\n$in_full full blocks, and $in_part partial blocks were read in.\n$out_full full blocks, and $out_part partial blocks were written out."

한 줄에 동일한 내용이 있음(\ 개행 제외)

IFS=' +' read in_full in_part _x _x out_full out_part _x _x bytes _x _x _x _x seconds _x speed speed_units < <( echo $(dd if=/dev/zero of=/dev/null bs=1024 count=7 2>&1) )
echo -e "$bytes bytes were read in $seconds seconds, speed was $speed $speed_units.\n$in_full full blocks, and $in_part partial blocks were read in.\n$out_full full blocks, and $out_part partial blocks were written out."

관련 정보