如何使用GREP获取特定数据?

如何使用GREP获取特定数据?,grep,Grep,命令: grep -oP '(?<=\"name\":\")[^"]*|(?<=\"title\":\")[^"]*' *.json >newjson 预期o/p: chMax:"Max Frequency in GHz", up:"UP", down:"DOWN", 文件内容: {"card":{"cardName":"10AN10G","portSignalRates":["10AN10G-1-OTU2","10AN10G-1-OTU2E","10AN10G-1-T

命令:

grep -oP '(?<=\"name\":\")[^"]*|(?<=\"title\":\")[^"]*' *.json >newjson
预期o/p:

chMax:"Max Frequency in GHz",

up:"UP",

down:"DOWN",
文件内容:

{"card":{"cardName":"10AN10G","portSignalRates":["10AN10G-1-OTU2","10AN10G-1-OTU2E","10AN10G-1-TENGIGE","10AN10G-1-STM64"],"listOfPort":{"10AN10G-1-OTU2":{"portAid":"10AN10G-1-OTU2","signalType":"OTU2","tabNames":["PortDetails"],"requestType":{"PortDetails":"PTP"},"paramDetailsMap":{"PortDetails":[{"type":"dijit.form.TextBox","name":"signalType","title":"Signal Rate","id":"","options":[],"label":"","value":"OTU2","checked":"","enabled":"false","selected":""},{"type":"dijit.form.TextBox","name":"userLabel","title":"Description","id":"","options":[],"label":"","value":"","checked":"","enabled":"true","selected":""},{"type":"dijit.form.Select","name":"Frequency","title":"Transmit Frequency",}}}}}}

我想你在找这个

$ grep -oP '(?<=\"name\":\")[^"]*|(?<=\"title\":)[^,]*' file
signalType
"Signal Rate"
userLabel
"Description"
Frequency
"Transmit Frequency"
以获得所需的输出

$ grep -oP '(?<=\"name\":\")[^"]*|(?<=\"title\":)[^,]*' file | paste -d: - -
signalType:"Signal Rate"
userLabel:"Description"
Frequency:"Transmit Frequency"

我认为您的问题在于,您正在使用“尝试删除”对两个组进行排序,您将更接近您要查找的内容,但如果名称和标题不是紧随其后,您可能需要添加一个术语来跳过任何中间标记,然后,您可能需要聪明地处理一个条目有名称但没有标题的情况

如上所述,grep不是解析json的最佳工具,还有很多其他工具-我个人建议使用python和json库加载您的文件,然后输出您需要的标记。

这里是一个gnu awk,用于提取数据:

awk -F\" '/title/ {print $3":"$7}' RS='name' file
signalType:Signal Rate
userLabel:Description
Frequency:Transmit Frequency

我没有看到您希望在文件中获取的数据。没有Max Frequency,没有up等,用grep解析JSON几乎没有意义。上面文件中的预期o/p:signalType:信号速率,userLabel:描述,Frequecy:传输频率,
awk -F\" '/title/ {print $3":"$7}' RS='name' file
signalType:Signal Rate
userLabel:Description
Frequency:Transmit Frequency