解析从XML的<c>标签提取code属性的Awk命令工作原理
命令工作原理详解
我们把整条命令拆成三个阶段逐一解释:
1. 读取文件内容
cat random.xml
这一步就是把random.xml的内容输出到标准输出,作为后续命令的输入源。
2. 筛选目标行
egrep "<c.*/>"
用egrep过滤出所有自闭合的<c>标签行:
- 正则
<c.*/>的含义是:匹配以<c开头、中间包含任意字符、最后以/>结尾的行 - 执行后会留下xml里的三行
<c>标签内容,排除<a>、<b>这类无关行
3. 提取code属性值(核心步骤)
awk -F1 ' /code=/ {f=NR} f&&NR-1==f' RS='"'
这部分是关键,拆解awk的参数和脚本逻辑:
参数说明
RS='"':把awk的记录分隔符设为双引号。这样awk会把输入内容按双引号分割成一段段"记录",比如第一个<c>标签行会被拆成这些片段:<c id=、123、code=、abc、date=、12-12-2022、/>-F1:这里把字段分隔符设为1,但因为已经用双引号分割了记录,每个记录本身就是独立内容,所以这个参数实际是冗余设置,没有发挥作用
脚本逻辑
awk会逐段处理每个记录:
/code=/ {f=NR}:当某个记录匹配code=(也就是遇到code=这段记录时),把当前的记录编号NR赋值给变量ff&&NR-1==f:当变量f存在(说明之前找到过code=的记录),并且当前记录的编号NR刚好比f大1时,输出当前记录- 因为
code=的下一个记录就是我们要的属性值(比如code=之后的abc),所以通过这个逻辑能精准提取code的内容 - 对于没有
code属性的<c>标签行,不会触发f=NR的赋值,也就不会输出任何内容
- 因为
最终输出结果就是所有<c>标签里的code属性值:
abc efg
内容的提问来源于stack exchange,提问作者pss
相关产品推荐
相关产品推荐

