O problema é que sua saída designada do dd vai para STDERR e não STDOUT , então você também tem que redirecionar STDERR e não apenas STDOUT .
Para o bash e o zsh, você pode usar |& em vez de | , o que também redirecionará STDERR a STDIN do segundo comando, por exemplo:
dd if=/dev/urandom of=/dev/null bs=1K count=10000 |& awk '/copied/ {print $8 " " $9}'
A abordagem mais geral é redirecionar STDERR explicitamente com 2>&1 , por exemplo:
dd if=/dev/urandom of=/dev/null bs=1K count=10000 2>&1 | awk '/copied/ {print $8 " " $9}'
Para a parte em python, consulte o módulo do subprocesso e Popen em particular.