使用bash awk sed提取文件

时间:2015-06-04 08:39:27

标签: bash awk

我有这样的文件(奇数行和偶数行有不同的类型内容):

try to upload UI/uploaded/2010.png
[{"index":"1","field":"file","exloc":"MiVip/07fb"}]
try to upload UI/uploaded/2011.png
[{"index":"1","field":"file","exloc":"MiVip/0487"}]

我想得到的是:

2010.png
MiVip/07fb
2011.png
MiVip/0487

此外,我希望将结果输出到一个数组中(以供后一个代码使用)。 我想使用bash(awk,sed可以在需要时使用)来做到这一点。

当我使用awk时,我无法找出正确的正则表达式 字段分隔符(我想使用,空格:“[] {和}用于字段分隔符,所以最后一个字段将是我想要的)。 最好的答案是为awk提供正确的分隔符。

或者回退到sed(将所有的,“[] {}替换为空格。”

2 个答案:

答案 0 :(得分:3)

简单明了:

sed -e '/^try to upload/s=.*/==; /^\[/{s=.*"exloc":"==;s="}\]==}' 

它使用所谓的“地址”,因此它转换为:如果该行以“尝试上传”开头,请删除最后一个斜杠的所有内容。如果该行以[开头,请移除"exloc":"以外的所有内容,并移除尾随的"}]

答案 1 :(得分:2)

试试这个awk单行:

awk '{c=$0~/\]$/?split($0,a,/"/)-1:split($0,a,/\//);print a[c]}' file

输入示例,输出:

kent$  awk '{c=$0~/\]$/?split($0,a,/"/)-1:split($0,a,/\//);print a[c]}' file
2010.png
MiVip/07fbde4d3abe340e22703f96494bf61e215995e3d
2011.png
MiVip/048734395a6442854877102d8f0a16ae4f642eaf8

这种方法使用了awk的split()函数。它会检查输入中每一行的最后一个字符,如果它以]结尾,与"分开,并打印array[len-1],否则我们会与/分开,数组中的最后一个元素。

如果您的输入的最后一个字符不应作为要检查的目标,您可以更改$0~/YourPattern/以使该行适合您。