macOS下Zsh中如何用tee将tmutil输出分发给多管道命令
单次运行
tmutil status提取备份进度与剩余时间 问题背景
使用tmutil status查看Time Machine备份状态时,输出如下:
% tmutil status Backup session status: { BackupPhase = Copying; ClientID = "com.apple.backupd"; DateOfStateChange = "2022-11-21 11:23:03 +0000"; DestinationID = "89E08126-7132-4D14-80B4-EFD45E8C5BFC"; FirstBackup = 1; Progress = { Percent = "0.1640944884974286"; TimeRemaining = 65013; "_raw_Percent" = "0.1640944884974286"; "_raw_totalBytes" = 488603537408; bytes = 80177147549; files = 159679; totalBytes = 488603537408; totalFiles = 3345928; }; Running = 1; Stopping = 0; }
原本可用以下两条命令分别提取完成百分比和剩余时间:
- 提取完成百分比:
tmutil status | grep "raw_Percent" | LC_NUMERIC="C" awk -F '"' '{print "Percent Complete: " ($4 * 100) "%"} ' - 提取剩余时间:
tmutil status | grep "TimeRemaining" | awk '{print "Time Remaining: " ($3/3600) " hours"} '
但由于tmutil status开销较大,希望仅运行一次该命令并将输出分发给两个处理管道。尝试的命令报错:
tmutil status | tee > (grep "raw_Percent" | LC_NUMERIC="C" awk -F '"' '{print "Percent Complete: " ($4 * 100) "%"} ') | (grep "TimeRemaining" | awk '{print "Time Remaining: " ($3/3600) " hours"} ')
报错信息:
zsh: no matches found: (grep raw_Percent | LC_NUMERIC=C awk -F " {print "Percent Complete: " ($4 * 100) "%"} )
解决方法
方法1:修正进程替换的语法问题
zsh报错是因为进程替换的括号前后空格、内部引号解析混乱。修正后的命令如下:
tmutil status | tee >(grep "_raw_Percent" | LC_NUMERIC="C" awk -F '"' '{print "Percent Complete: " ($4 * 100) "%"}') | grep "TimeRemaining" | awk '{print "Time Remaining: " ($3/3600) " hours"}'
关键修正点:进程替换的>(...)括号前后不能加空格;确保awk脚本的引号嵌套正确,避免shell误解析。
方法2:用awk一次性处理(更高效)
无需多次管道和grep,直接用awk单次扫描输出即可同时提取两个字段,性能更优:
tmutil status | LC_NUMERIC="C" awk ' /_raw_Percent/ { percent = $3 * 100; gsub(/"/, "", percent); printf "Percent Complete: %.2f%%\n", percent } /TimeRemaining/ { hours = $3 / 3600; printf "Time Remaining: %.2f hours\n", hours }'
说明:
- 用正则匹配目标行,直接提取对应字段计算
gsub(/"/, "", percent)去除百分比字段的引号printf可格式化输出小数位数(按需调整)LC_NUMERIC="C"确保小数用点号而非逗号,避免计算错误
内容的提问来源于stack exchange,提问作者Vihung
相关产品推荐
相关产品推荐

