我正在创建一个脚本,它将使用以下命令实时获取插入驱动器的 UUID
udiskctl monitor
这些是一些标准输出行
HintPartitionable: true
HintSymbolicIconName:
HintSystem: false
Id: by-uuid-EXTERNALLABEL
IdLabel:
IdType: vfat
IdUUID: EXTERNALLABEL
IdUsage: filesystem
IdVersion: FAT32
所以我想得到前面的字符串idUUID:
预期输出:
EXTERNALLABEL
有人有什么想法吗?请提出建议?
答案1
这是一个常见问题,已经有关于如何执行此操作的答案,但您可以使用awk
以下方法:
udiskctl monitor | awk '{if (match($0,"^[[:space:]]*IdUUID:[[:space:]]*([[:print:]]+)",a)) print a[1]}'
或者,按照@Archemar的建议甚至更短
udiskctl monitor | awk '/^[[:space:]]*IdUUID:/ {print $2}'
或者,按照@Ed Morton的建议更强大:
udiskctl monitor | awk '$1=="IdUUID:"{print $2}'
或者当然,好老sed
:
udiskctl monitor | sed -e 's/^[[:space:]]*IdUUID:[[:space:]]*//;t;d'
答案2
正确答案是:
$ awk '$1=="IdUUID:"{print $2}' file
EXTERNALLABEL
当前接受的答案是不必要且错误地将您要搜索的字符串视为正则表达式,因此如果您的字符串包含正则表达式元字符,则该方法将会失败。
答案3
版权所有詹姆斯·丹尼尔·马尔斯·里奇。该材料是为提交于 'awk - 提取“somestring:”前面的值' 根据 cc by-sa 4.0 的条款(https://creativecommons.org/licenses/by-sa/4.0/legalcode),但也可以从 'https://snippetly.blogspot.com/2019/12/extracting-value.html' 根据以下任何许可证的条款:可理解的开放许可证 3.0 (https://jamesdanielmarrsritchey.blogspot.com/2019/06/compressive-open-license-30.html),麻省理工学院(https://opensource.org/licenses/MIT)。
作为 Awk 的替代方案,使用 PHP,您可以通过使用换行符作为分隔符将输出分解为数组来提取字符串的值部分。然后使用冒号作为分隔符将每个数组值分解为另一个数组。接下来修剪每个值开头和结尾的空格。最后执行检查以查看是否是您想要的条目,以及是否回显该值。
<?php
$output = <<<'EOT'
Item1: Value1
Item2: Value2
Item3: Value3
Item4: Value4
EOT;
$data = explode("\n", $output);
foreach ($data as $item){
$result = FALSE;
$value = explode(':', $item);
if (trim($value[0]) === 'Item3'){
echo trim($value[1]) . "\n";
exit(0);
}
}
echo "Value not found.\n";
exit(1);
?>