linux shell 字符串匹配截取(PS: 前后的格式是不固定的)
迷茫
迷茫 2017-04-17 15:21:19
[Linux讨论组]

示例字符串:

Connections: authenticated: 10.0.115.172::56498, as admin (Full access)

想要的返回内容为:

10.0.115.172::56498
迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(6)
伊谢尔伦

自己试着写出来了,可以解决场景需求 @wusisu

res=$(expr 'Connections: authenticated: 10.0.115.172::56498, as admin (Full access)' : '.*\( [0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+::[0-9]\+\)'); echo $res
迷茫

前后不变的话

替换字符串:
sed 's/被替换字符串/新字符串/g'

就好了


比如

echo "Connections: authenticated: 10.0.115.172::56498, as admin (Full access)" | sed 's/Connections: authenticated://g' | sed 's/, as admin (Full access)//g'

正则的话,感觉用awk好麻烦。
给一个python的解答吧,反正都基本是标配的脚本语言了。

echo "Connections: authenticated: 10.0.115.172::56498, as admin (Full access)" | xargs python -c 'import sys;import re;print re.compile("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}::\d{0,5}").search("".join(sys.argv)).group();'
伊谢尔伦

echo 'Connections: authenticated: 10.0.115.172::56498, as admin (Full access)' | cut -d ' ' -f 3 | cut -d , -f 1

大家讲道理

1.做这种字符串截取,一定要先弄清楚,哪些是变化量,哪些是不变量。


2.切割,当然是用awk来进行。

如果用cut做切割,关键字只能是单个字符char,而awk的关键字可以为字符串string。

这种能够直接切割的地方,用正则是在浪费CPU、内存,认为地增加处理时间。


3.awk切割的用法:

awk -F【关键字】 '{print $n}'

注意,-F与关键字之间无空格,关键字与【'】之间有一个空格,print与【$】之间有空格。如果关键字是空格,或者特殊字符,尝试在它左右两侧添加双引号或单引号。

切分后,n是下标,下标从1开始。


4.如果只有IP和端口是变化的,其它是不变的,那么,对于原始字符串:

echo "Connections: authenticated: 10.0.115.172::56498, as admin (Full access)"

切分,按照先整体后部分的原则,先分割冒号与空格:

1->【Connections】
2->【authenticated】
3->【10.0.115.172::56498, as admin (Full access)】

切割命令:

awk -F": " '{print $3}'

切割结果:

[root@localhost ~]# echo "Connections: authenticated: 10.0.115.172::56498, as admin (Full access)" | awk -F": " '{print $3}'
10.0.115.172::56498, as admin (Full access)

然后再把3->【10.0.115.172::56498, as admin (Full access)】按逗号与空格分割:

1->【10.0.115.172::56498】
2->【as admin (Full access)】

1即为所求。

切割命令:

awk -F", " '{print $1}'

切割结果:

[root@localhost ~]# echo "Connections: authenticated: 10.0.115.172::56498, as admin (Full access)" | awk -F": " '{print $3}' | awk -F", " '{print $1}'
10.0.115.172::56498

测试平台:RHEL5.x、CentOS 5.x

打完这么多【切割】二字,只觉得JJ凉飕飕的。

PHPz
echo "Connections: authenticated: 10.0.115.172::56498, as admin (Full access)"|sed -r 's/.* ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+::[0-9]+), .*/\1/g'
大家讲道理

echo "Connections: authenticated: 10.0.115.172::56498, as admin (Full access)" | cut -d , -f 1 | cut -d ' ' -f3

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号