如何基于@@id字段检索指定数据并提取对应字段的值
实现方案
方案1:单awk命令实现(推荐,鲁棒性更高)
直接用awk一次完成ID匹配、字段提取,不需要多管道接力,适配字段值含特殊字符的场景,还支持忽略大小写匹配字段名,完整脚本如下:
#!/bin/bash # usage: search.sh <id> <field> # eg: search 123 age search_id="$1" target_field="$2" awk -v id="$search_id" -v field="$target_field" ' # 匹配对应ID所在的行 $0 ~ "^@@id: " id { # 按@@分割行内容为独立的键值对块 split($0, kv_pairs, /@@/) for (i in kv_pairs) { current = kv_pairs[i] # 忽略大小写匹配目标字段 if (tolower(current) ~ "^" tolower(field) ": ") { # 截取冒号后的字段值输出 sub(/^[^:]+: /, "", current) print current exit } } }' sample
执行chmod +x search.sh后运行./search.sh 123 gender即可输出预期结果Male。
方案2:补全你原有grep逻辑的管道部分
如果你不想改动原有grep的写法,在管道后加一行sed即可实现提取:
grep "^@@id: ${search}" sample | sed -E "s/.*@@${field}: ([^@]+).*/\1/I"
末尾的I参数代表忽略字段名大小写匹配,如果要求字段名大小写完全对应,删除I即可。该方案仅适用于字段值不含@字符的场景。
内容的提问来源于stack exchange,提问作者Kalib Zen
相关产品推荐
相关产品推荐

