如何在BASH中提取timedatectl输出里'Warning'前的内容?
解决timedatectl状态输出中剔除警告的问题
嘿,我来帮你搞定这个问题~你的命令没生效的核心原因是:timedatectl status的警告信息是输出到标准错误(stderr),而你用$(...)默认只捕获标准输出(stdout),所以awk根本没拿到包含"Warning"的内容,自然没法按它拆分。
下面给你几个可行的解决方案:
方案1:精准获取时间同步状态(推荐)
其实timedatectl本身就支持直接查询特定状态属性,不用过滤整个输出,这样更靠谱也更简洁:
echo Time Sync Status: "$(timedatectl show -p NTPSynchronized,TimeUSec --value)"
-p NTPSynchronized,TimeUSec:指定只显示时间同步状态和当前时间这两个属性--value:只输出属性值,去掉前缀,输出更干净
方案2:合并输出后用awk拆分
如果你一定要通过拆分"Warning"来实现,需要先把stderr重定向到stdout,让awk能捕获到警告内容:
echo Time Sync Status: "$(timedatectl status 2>&1 | awk -F 'Warning' '{print $1}')"
这里的2>&1是把标准错误(文件描述符2)重定向到标准输出(文件描述符1),这样$(...)就能拿到所有输出内容,awk也就可以按"Warning"拆分了。
方案3:用sed截断到警告前
用sed可以更直观地截断到第一个出现"Warning"的位置之前:
echo Time Sync Status: "$(timedatectl status 2>&1 | sed '/Warning/Q')"
/Warning/Q表示找到包含"Warning"的行就立即退出,只输出之前的所有内容。
内容的提问来源于stack exchange,提问作者RSH
相关产品推荐
相关产品推荐

