我有一个日志文件,每次无法从 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
它从行的开头到第二个冒号进行搜索,仅搜索非 ':' 的字符,但仅保留第一个和第二个冒号之间的字符。我注意到文件名前面有一个空格,所以我将其删除。