Mic*_*ler 5 regex unix linux grep docker
pcregrep 中的 -oX 选项有问题。使用不同的数字指定多个此类选项仅输出最后指定的捕获组。
数据:
docker ps | awk '{print $1}' | tail -n +2 | xargs docker inspect
输出:
[{
"ID": "4e7f430263c33c25970134760ea96f9b57452680a8cfdf062270f5f7fe385135",
.... #lots of additional lines
"Ports": {
"5000/tcp": [
{
"HostIp": "127.0.0.1",
"HostPort": "5000"
}
],
"5984/tcp": [
{
"HostIp": "127.0.0.1",
"HostPort": "5984"
}
]
}
},{
#same as above, but with a different ID and HostPort 5000
}]
Run Code Online (Sandbox Code Playgroud)
想法
docker ps | awk '{print $1}' | tail -n +2 | xargs docker inspect | pcregrep -M -o1 'ID":\s"(\w*)(?:\n|.)*?HostPort":\s"(\w)'
输出
4e7f430263c33c25970134760ea96f9b57452680a8cfdf062270f5f7fe385135
db35ce4b1fc7580ff43bacda5e961c4741c9447e97dbbdbf38218d068b0132af
Run Code Online (Sandbox Code Playgroud)
和
docker ps | awk '{print $1}' | tail -n +2 | xargs docker inspect | pcregrep -M -o2 'ID":\s"(\w*)(?:\n|.)*?HostPort":\s"(\w*)'
输出
8000
5000
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切都很好。现在我想将这些输出组合在同一条线上。pcregrep -M -o
但是也输出之间的所有内容(似乎忽略了中间组不捕获)并且pcregrep -M -o1 -o2
仅输出第二组 - 第二个选项似乎覆盖了第一个选项。这是在 Ubuntu 12.04 LTS 上。
知道如何获得输出
4e7f430263c33c25970134760ea96f9b57452680a8cfdf062270f5f7fe385135 8000
db35ce4b1fc7580ff43bacda5e961c4741c9447e97dbbdbf38218d068b0132af 5000
Run Code Online (Sandbox Code Playgroud)
并仍然保持“unixy”(最好没有 perl/python/ruby 脚本)?
背景:我想自动停止docker中占用特定端口的容器。
小智 4
万一有人想知道 10 年后......
-o
现在是 的一个成熟的部分pcregrep
,而且,它还附带了一个朋友:--om-separator=text
。
所以原来问题的答案是:添加--om-separator=" "
到pcregrep
.
PS 我觉得奇怪的是,并不是所有的手册页网站都会列出它,pcregrep --help
但确实如此。
归档时间: |
|
查看次数: |
3913 次 |
最近记录: |