假设我有一个使用多个管道的命令。这可以是任何命令,但例如让我们使用这个简单的剪切和排序。例如
cat data.tsv | cut -f1,5,8,12 | sort | uniq -c | sed -e "s/cat/dog/g" | sort -k1nr > output.tsv
我如何“分析”这个?
无论如何,我可以说是 sed 或 uniq 减慢了我的执行时间吗?
在我的理想世界中,我希望看到这样的东西:
1- cat: 15 lines per second
2- cut: 13 lines per second
3- sort: 6 lines per second
4- uniq: 6 lines per second (Limited by input)
5- sed: 6 lines per second (Limited by input)
6- sort 6 lines per second (Limited by input)
7- write 6 lines per second (Limited by input)
有任何想法吗?
答案1
我建议使用pv
来计算通过管道的行数。通过pv你可以一步步找到瓶颈。
cat data.tsv | pv -lr > /dev/null
cat data.tsv | cut -f1,5,8,12 | pv -lr > /dev/null
cat data.tsv | cut -f1,5,8,12 | sort | pv -lr > /dev/null
cat data.tsv | cut -f1,5,8,12 | sort | uniq -c | pv -lr > /dev/null
...
pv 输出示例:
timeout 10 yes | sed 's/yes/foo/' | rev | pv -lr >/dev/null
[ 120k/s]