Linux命令提取一行中的特定术语

时间:2019-05-14 13:55:37

标签: linux awk sed grep cut

https://textmap.com/api/3.0/repository/123456-7654-1234-a122-7654321/import/8888-2222-1234-a122-45555/status
https://textmap.com/api/3.0/repository/123456-7654-1234-a122-7654321/import/8888-2222-1234-a122-45555/status
https://textmap.com/api/3.0/repository/123456-7654-1234-a122-7654321/import/8888-2222-1234-a122-45555/status
https://textmap.com/api/3.0/repository/123456-7654-1234-a122-7654321/import/8888-2222-1234-a122-45555/status

我需要在存储库和导入后提取不同的术语

所需的输出:

123456-7654-1234-a122-7654321   
8888-2222-1234-a122-45555

我尝试使用grep -o但没有运气

1 个答案:

答案 0 :(得分:1)

假设文件中包含链接,则可以执行以下操作:

$ grep -oP '(repository|import)/\K[^/]+' file
123456-7654-1234-a122-7654321
8888-2222-1234-a122-45555
123456-7654-1234-a122-7654321
8888-2222-1234-a122-45555
123456-7654-1234-a122-7654321
8888-2222-1234-a122-45555
123456-7654-1234-a122-7654321
8888-2222-1234-a122-45555

并仅获取唯一值:

$ grep -oP '(repository|import)/\K[^/]+' file | sort -u
123456-7654-1234-a122-7654321
8888-2222-1234-a122-45555

-o的意思是“仅打印行中匹配的部分”,而-P则启用Perl兼容的正则表达式。 \K是PCRE功能,基本上意味着“忘记到目前为止所有匹配的内容”。在这里,我们使用它来仅匹配字符串repository/或字符串import/之后的行的一部分,并将其丢弃,使其不包含在输出中。然后,我们寻找一个或多个非/[^/]+)的最长延伸。

如果您需要每对都在同一行上,请使用:

$ perl -pe 's|.*/repository/([^/]+)/import/([^/]+)/.*|$1 $2|' file | sort -u
123456-7654-1234-a122-7654321 8888-2222-1234-a122-45555