如何用awk按名称提取dconf导出的gnome-terminal配置profile
基于Mawk实现Gnome Terminal配置Profile的筛选与提取
核心思路
Gnome Terminal通过dconf存储的所有Profile天然按块分隔,每个块以[:<UUID>]为起始,连续多行配置内容为块体,直到下一个[:<UUID>]行出现。mawk支持逐行状态跟踪,天然解决grep无法跨行关联同一块内内容的问题,不需要提前预估单块长度,也不会出现匹配串块的问题。
场景1:快速提取所有Profile的UUID与可见名称
单独导出Profile时需要对应UUID作为标识,用以下命令可以直接输出两列配对结果,不需要手动翻找完整dconf输出:
dconf dump /org/gnome/terminal/legacy/profiles:/ | mawk ' /^\[:/ { # 从[:xxx]格式的行中提取UUID profile_uuid = substr($0, 3, length($0) - 3) } /visible-name=/ { # 通过ASCII值生成单引号,避免shell转义问题 quote = sprintf("%c", 39) # 从visible-name行中提取引号包裹的可见名称 profile_name = substr($0, index($0, quote) + 1) sub(quote ".*$", "", profile_name) # 输出用制表符分隔的UUID与名称对 print profile_uuid "\t" profile_name } '
输出效果示例:
c812de27-9bc9-414b-a263-4995c1ec775a gh_dark 2f91a7c3-1d4e-4f2a-b8c9-7d3e2f1a9b0c default
场景2:按可见名称筛选完整Profile块并导出
匹配到指定可见名称后,自动输出该Profile的完整配置块,输出格式与dconf原生格式完全一致,可直接用于跨设备导入:
# 将<目标可见名称>替换为实际要导出的Profile名称,例如gh_dark dconf dump /org/gnome/terminal/legacy/profiles:/ | mawk -v target="<目标可见名称>" ' # 遇到新块开头时,先判断上一个缓存块是否为目标配置,避免漏存 /^\[:/ { if (is_target) print block_buffer # 重置块跟踪状态 is_target = 0 block_buffer = "" } # 将当前行缓存到当前块的内容中 { block_buffer = block_buffer $0 ORS } # 匹配当前块的可见名称,标记目标块 /visible-name=/ { quote = sprintf("%c", 39) current_name = substr($0, index($0, quote) + 1) sub(quote ".*$", "", current_name) if (current_name == target) is_target = 1 } # 处理文件末尾的最后一个块,避免漏输出 END { if (is_target) print block_buffer } ' > 目标profile.dconf
导出的文件可以直接在目标设备上执行导入:dconf load /org/gnome/terminal/legacy/profiles:/ < 目标profile.dconf
常见问题说明
- grep匹配失效的核心原因:grep默认逐行处理文本,无法关联相隔多行的块标识行与visible-name行;叠加-A参数时,因单Profile行数不固定,要么多截取相邻Profile内容,要么遗漏当前Profile的末尾配置行,无法保证准确性。
- 兼容性说明:以上命令全部适配Ubuntu默认安装的mawk,没有使用gawk专属语法,不需要额外安装其他文本处理工具。
- 匹配规则说明:名称匹配采用完全匹配规则,避免同名混淆的错误导出。
内容的提问来源于stack exchange,提问作者Winter Sand
相关产品推荐
相关产品推荐

