내 컴퓨터의 쓰기 속도를 추정하기 위해 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
리디렉션도 수행해야 한다는 것입니다 .STDERR
STDOUT
|&
bash 및 zsh의 경우 이것을 대신 사용할 수 있으며 , 이는 두 번째 명령 으로 |
도 리디렉션됩니다 . 예:STDERR
STDIN
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."