Qt 4.8中如何无需正则表达式提取QProcess执行结果里的Use%字段值?
解决Qt 4.8中提取df命令Use%值的问题
首先得说清楚,你原来的QProcess写法有个小问题:直接把带管道的命令传给start(),QProcess默认不会调用shell来解析管道,所以df会把| awk {'print $5'}当成一个普通参数,自然就返回了完整的df输出,没执行awk处理。
方法一:让shell帮你处理管道(直接得到目标值)
你可以让bash来执行整个命令串,这样管道就能正常工作了。修改代码如下:
QProcess process1; // 用bash -c来执行带管道的命令 process1.start("/bin/bash", QStringList() << "-c" << "df /local | awk '{print $5}'"); process1.waitForFinished(1000); QString stdout = process1.readAllStandardOutput().trimmed(); // trimmed去掉多余换行和空格 qDebug() << stdout; // 这里直接输出4%
这样执行后,stdout里就是你要的Use%对应的值,不用再额外处理。
方法二:解析完整的df输出(不用正则提取目标值)
如果因为某些原因你已经拿到了完整的df输出,想要不用正则提取Use%的值,可以按以下步骤来:
- 把输出按换行符分割,过滤掉空行,取实际的数据行(也就是第二行)
- 把数据行按空白字符分割成字符串列表(Qt的
split()可以自动处理多个连续空格) - 取列表中对应Use%的位置的元素(从0开始索引是4,因为数据行的字段依次是:设备名、总块数、已用、可用、使用率、挂载点)
代码示例:
QString fullOutput = "Filesystem 1K-blocks Used Available Use% Mounted on\n/dev/ubi0_1 20184 680 18436 4% /local "; // 分割成行,过滤空行 QStringList lines = fullOutput.split('\n', QString::SkipEmptyParts); if (lines.size() >= 2) { // 取数据行,按空白分割(这里用正则只是分割空白,不是提取目标值) QStringList fields = lines[1].split(QRegExp("\\s+"), QString::SkipEmptyParts); if (fields.size() >= 5) { QString usePercent = fields[4]; qDebug() << usePercent; // 输出4% } }
这里用到的QRegExp只是用来处理连续空白的分割,并非用来匹配提取目标值,完全符合你“无需使用正则表达式提取结果”的要求。
另外提醒下,waitForFinished(1000)的超时时间是1秒,如果df命令执行较慢的话可能会超时,可以适当调大这个值,比如3000(3秒)。
内容的提问来源于stack exchange,提问作者Gabriel Silva
相关产品推荐
相关产品推荐

