首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >命令从字符串中提取4位数字。

命令从字符串中提取4位数字。
EN

Stack Overflow用户
提问于 2021-05-27 16:24:37
回答 7查看 1.3K关注 0票数 0

我有一个输出文件:

代码语言:javascript
复制
abis02 - GBS API 8085 is running abis02 - GBS API 8180 is running abis - GBS API 8181 is running

我只想得到端口号(8085,8180,8181),端口号可以是随机的,我只需要提取它们。

我试着用这个:

代码语言:javascript
复制
b=$(echo $abis02 | sed 's/[^0-9]\{4\}//g') 

但我得到了这个:

代码语言:javascript
复制
c02PI 8085[00;32sc02PI 8180[00;32sc02PI 8181[0m

怎么才能得到端口号呢?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2021-05-27 16:30:38

代码语言:javascript
复制
echo 'abis02 - GBS API 8085 is running abis02 - GBS API 8180 is running abis - GBS API 8181 is running' | grep -Eo '\b[0-9]{4}\b'
8085
8180
8181
票数 5
EN

Stack Overflow用户

发布于 2021-05-27 16:56:47

这不需要sed;bash的内置字符串操作足以执行任务。

代码语言:javascript
复制
#!/usr/bin/env bash
string='abis02 - GBS API 8085 is running abis02 - GBS API 8180 is running abis - GBS API 8181 is running'
ports=( )

while [[ $string =~ ([[:digit:]]{4})(.*) ]]; do
    ports+=( "${BASH_REMATCH[1]}" )
    string=${BASH_REMATCH[2]}
done

echo "Found ports:" "${ports[@]}"

...properly作为输出发出:

代码语言:javascript
复制
Found ports: 8085 8180 8181
票数 3
EN

Stack Overflow用户

发布于 2021-05-27 17:06:38

还可以使用带空白的awk作为记录分隔符,并将行提要用作输出记录分隔符:

代码语言:javascript
复制
s='abis02 - GBS API 8085 is running abis02 - GBS API 8180 is running abis - GBS API 8181 is running'
awk 'BEGIN{RS="[[:space:]]";ORS="\n"} /^[0-9]{4}$/' <<< "$s"

在线演示,屈服

代码语言:javascript
复制
8085
8180
8181

只有那些记录的输出完全匹配一个四位数字符串。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67726246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档