如何从 grep 输出中提取特定的键值对

问题描述

我在一个文件夹中有 grep 的输出,如下所示,

./Data1/TEST_Data1.xml:<def-query collection="FT_R1Event" count="-1" desc="" durationEnd="1" durationStart="0" durationType="CAL" fromWS="Data1" id="_q1" timeUnit="D">

./Data2/TEST_Data2.xml:<def-query collection="FT_R2Event" count="-1" desc="" durationEnd="2" durationStart="0" durationType="ABS" fromWS="Data2" id="_q1" timeUnit="M">

我想提取下面的内容,然后是一些分隔符,比如下面的“,”,

Data1/TEST_Data1,durationEnd="1",timeUnit="D"

Data2/TEST_Data2,durationEnd="2",timeUnit="M"

请帮助我使用基本的 linux 命令来实现这一点。

解决方法

我会按照以下方式使用 GNU AWK 来完成。让 file.txt 内容成为

./Data1/TEST_Data1.xml:<def-query collection="FT_R1Event" count="-1" desc="" durationEnd="1" durationStart="0" durationType="CAL" fromWS="Data1" id="_q1" timeUnit="D">

./Data2/TEST_Data2.xml:<def-query collection="FT_R2Event" count="-1" desc="" durationEnd="2" durationStart="0" durationType="ABS" fromWS="Data2" id="_q1" timeUnit="M">

然后

awk 'BEGIN{OFS=",";FPAT="(^[^ ]+xml)|((durationEnd|timeUnit)=\"[^\"]+\")"}{gsub(/\.([/]|xml)/,"",$1);print}' file.txt

输出

Data1/TEST_Data1,durationEnd="1",timeUnit="D"

Data2/TEST_Data2,durationEnd="2",timeUnit="M"

说明:我使用 FPAT 来提取有趣的输入元素,即这些元素从一开始就不含空格并且后面跟着 xml 或 ((durationEnd 或 {{1} }) 后跟 timeUnit" ")。然后我删除 " 后跟 ./ (注意 xml 必须是文字 . 所以它被转义)。然后我打印所有内容,它由 . 连接,因为我将其设置为输出字段分隔符 (,)。

免责声明:我仅使用显示的样本对其进行了测试。

(在 gawk 4.2.1 中测试)