如何提取第一对冒号内的文本

如何提取第一对冒号内的文本

我有一个日志文件,每次无法从 tar 中提取文件时都会保存此类行。

tar: foto/201802131354184186718718.xml: No se puede efectuar open: File exists
tar: foto/201802131365468046840684.xml: No se puede efectuar open: File exists

我需要获取第一对冒号“:”内的文本

例子

foto/201802131354184186718718.xml
foto/201802131365468046840684.xml

我尝试过使用 grep 但我得到了这个:

$ grep -oP '\:\K[^\:]+' 20180213.tmp 
 foto/201802131354184186718718.xml
 No se puede efectuar open
 File exists
 foto/201802131365468046840684.xml
 No se puede efectuar open
 File exists

答案1

首先,最简单的方法是使用其他工具,例如cut -d: -f2 20180213.tmp.awk -F: '{print $2}' 20180213.tmp

不过,我还想解释一下为什么你的grep方法失败了。这是因为它匹配全部a 之后的字符串:。要修复此问题,您可以将正则表达式中的第一个:与处理行中的第一个相匹配,方法是^[^\:]*在其前面添加。因此,原始正则表达式之前的任何字符都不能是:.完整的命令是:

grep -oP '^[^\:]*\:\K[^\:]+' 20180213.tmp

另请注意,您不需要:在正则表达式中转义,因此您可以使用以下方法进一步简化它:

grep -oP '^[^:]*:\K[^:]+' 20180213.tmp

答案2

事实上,使用 cut 等其他工具是最好的方法,但我也想抛出一个 sed 解决方案:

sed -r 's/^[^:]+: ?([^:]+):.*/\1/' 20180213.tmp

它从行的开头到第二个冒号进行搜索,仅搜索非 ':' 的字符,但仅保留第一个和第二个冒号之间的字符。我注意到文件名前面有一个空格,所以我将其删除。

相关内容