我有一个以这种格式开头的文件
INFO|NOT-CLONED|/folder/another-folder/another-folder|last-folder-name|
我需要读取文件并获取以下输出:
INFO|NOT-CLONED|last-folder-name
到目前为止,我已经拥有了:
cat clone_them.log | grep 'INFO|NOT-CLONED' | sed -E 's/INFO\|NOT-CLONED\|(.*)/g'
但是无法正常工作
注意:最后一个“另一个文件夹”和“最后一个文件夹名称”相同
答案 0 :(得分:1)
在awk
中它更简单,因为输入文件由|
符号正确分隔。您需要告诉awk
,输入字段之间用|
隔开,并且输出也应该分别使用|
和IFS
用OFS
符号分开。
awk 'BEGIN{FS=OFS="|"}/INFO\|NOT-CLONED/{print $1,$2,$(NF-1)}' clone_them.log
INFO|NOT-CLONED|last-folder-name
答案 1 :(得分:1)
如果要使用sed解决方案:
$ sed -En 's/(INFO\|NOT-CLONED\|).*\|([^|]*)\|$/\1\2/p' file
INFO|NOT-CLONED|last-folder-name
工作原理:
-E
使用扩展的正则表达式
-n
除非我们明确告知,否则请不要打印。
s/(INFO\|NOT-CLONED\|).*\|([^|]*)\|$/\1\2/p
查找包含INFO|NOT-CLONED|
(将其保存在组1中),后跟.*
,后跟|
和后跟任何非|
,{{ 1}}(保存在组2中),然后在行的末尾插入[^|]*
。替换文本为第1组,然后是第2组。
|
选项告诉sed如果匹配成功,则打印行。由于仅对包含p
的行替换成功,因此无需进行额外的INFO|NOT-CLONED|
处理。
要只获取grep
而没有last-folder-name
,我们只需从输出中删除INFO|NOT-CLONED
:
\1
由于我们不再需要第一个捕获组,因此我们可以简化并删除现在不需要的parens,以便唯一的捕获组是最后一个文件夹名称:
$ sed -En 's/(INFO\|NOT-CLONED\|).*\|([^|]*)\|$/\2/p' file
last-folder-name