我正在使用以下sed命令从Docker组成的日志文件中获取一个变量:
sudo cat $(docker inspect --format='{{.LogPath}}' xxxxx) | grep -s TOKEN|sed 's/.*TOKEN=//'
这很好,但是返回:
57ac8392-1ecc-4e17-9350-c9c866ac832b\n","stream":"stderr","time":"2018-12-16T19:55:54.032838023Z"}
TOKEN
的确是:57ac8392-1ecc-4e17-9350-c9c866ac832b
。但是我不确定如何将换行符(\n
改为 仅包含UUID后将其断开。
答案 0 :(得分:1)
要通过sed
实现所需的功能,您需要捕获模式中的令牌,并使用对它的反向引用作为替换:
$ cat data
TOKEN=57ac8392-1ecc-4e17-9350-c9c866ac832b\n","stream":"stderr","time":"2018-12-16T19:55:54.032838023Z"}
$ cat data | sed -e 's/.*TOKEN=\([-a-f0-9]\+\)\\n.*/\1/'
57ac8392-1ecc-4e17-9350-c9c866ac832b
您是否正在使用GNU grep
?如果是这样,您可以单独将其定位为令牌,如下所示:
$ grep -sPo '(?<=TOKEN=)[-a-f0-9]+' < data
57ac8392-1ecc-4e17-9350-c9c866ac832b
解释:
在GNU grep
中,-P
将给定模式解释为PCRE,从而启用了传统POSIX正则表达式语言中不可用的功能。其中之一是由(?<=...)
表示的“正向后向”,它实际上是告诉正则表达式引擎向后退一步,以查看后向内部中的文本是否可以在那里匹配,但实际上不匹配。这样,您就可以对给定字符串进行“锚定”匹配,但不能捕获它们。
-o
的{{1}}标志只是告诉它仅打印给定输入的匹配部分。
结合使用这两个标志后,我们就可以在模式中使用grep
来锚定匹配项,但只显示真实的令牌数据。