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
}]
- 创意**
docker ps | awk '{print $1}' | tail -n +2 | xargs docker inspect | pcregrep -M -o1 'ID":\s"(\w*)(?:\n|.)*?HostPort":\s"(\w)'
产出
4e7f430263c33c25970134760ea96f9b57452680a8cfdf062270f5f7fe385135
db35ce4b1fc7580ff43bacda5e961c4741c9447e97dbbdbf38218d068b0132af
以及docker ps | awk '{print $1}' | tail -n +2 | xargs docker inspect | pcregrep -M -o2 'ID":\s"(\w*)(?:\n|.)*?HostPort":\s"(\w*)'
产出
8000
5000
到目前为止一切顺利。现在我想把这些输出合并在同一条线上。pcregrep -M -o
输出中间的所有内容(似乎忽略了中间组是非捕获的),pcregrep -M -o1 -o2
只输出第二组-第二个选项似乎覆盖了第一个选项。这是在Ubuntu 12.04 LTS上。
你知道怎么得到输出吗
4e7f430263c33c25970134760ea96f9b57452680a8cfdf062270f5f7fe385135 8000
db35ce4b1fc7580ff43bacda5e961c4741c9447e97dbbdbf38218d068b0132af 5000
并且仍然保持它的"unixy"(最好没有Perl/Python/Ruby脚本)?
背景:我想自动停止在码头占用特定港口的集装箱。
2条答案
按热度按时间jtjikinw1#
将
-o
多次指定为pcregrep
的功能似乎是最近的发展(version 8.32,发布于2012年11月30日)。我假设您的发行版还没有这个功能。:-)所以,使用awk
代替。另外,用第一个awk
脚本中的等效功能替换原始脚本中tail
的多余使用。kpbwa7wx2#
以防有人在10年后想知道...
-o
现在是pcregrep
的成熟组成部分,而且它还附带了一个朋友:--om-separator=text
.所以最初问题的答案是:把
--om-separator=" "
加到pcregrep
上。我觉得奇怪的是,并不是所有的手册页网站都列出了它,
pcregrep --help
确实列出了。