免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2207 | 回复: 11
打印 上一主题 下一主题

请教一个sed的问题。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-01 15:38 |只看该作者 |倒序浏览
,server1,1,server,1024,2048,4096,1,2,4,0.1,0.2,0.4,500,20,10,,50,
,,,,,,,,,,,,,,21,20,,51,
,,,,,,,,,,,,,,22,30,,52,
,,,,,,,,,,,,,,23,40,,53,
,server2,2,server,1024,2048,4096,1,2,4,0.1,0.2,0.4,500,20,11,,50,
,,,,,,,,,,,,,,21,21,,51,
,,,,,,,,,,,,,,22,31,,52,
,,,,,,,,,,,,,,23,41,,53,
,client1,3,client,256,512,1024,1,2,4,0.1,0.2,0.4,100,10,10,,50,30
,,,,,,,,,,,,,,11,20,,,
,,,,,,,,,,,,,,12,30,,50,31
,,,,,,,,,,,,,,13,40,,,
,client2,4,client,512,1024,2048,2,4,6,0.2,1,2,100,10,11,,51,30
,,,,,,,,,,,,,,11,41,,51,31



请教一个问题。
现在有这样一段内容,4台机器,server1、server2、client1、client2。

server1的信息内容是在server2那行的上面所有行,这里也就是1-4行,(当然有时候不一定是1-4行)。
,server1,1,server,1024,2048,4096,1,2,4,0.1,0.2,0.4,500,20,10,,50,
,,,,,,,,,,,,,,21,20,,51,
,,,,,,,,,,,,,,22,30,,52,
,,,,,,,,,,,,,,23,40,,53,


server2的信息内容是在server2那行到client1那行的上面。以此类推。
,server2,2,server,1024,2048,4096,1,2,4,0.1,0.2,0.4,500,20,11,,50,
,,,,,,,,,,,,,,21,21,,51,
,,,,,,,,,,,,,,22,31,,52,
,,,,,,,,,,,,,,23,41,,53,


想请教一下如何用sed命令分别取出4台机器的信息呢?  谢谢!
dragon23452345 该用户已被删除
2 [报告]
发表于 2012-04-01 15:48 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
dragon23452345 该用户已被删除
3 [报告]
发表于 2012-04-01 15:59 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2012-04-01 16:30 |只看该作者
谢谢! 可以实现了。
{:a;p;n;/^,,/ba;q} 能不能解释一下怎么理解呢!

谢谢!

论坛徽章:
0
5 [报告]
发表于 2012-04-01 17:05 |只看该作者
本帖最后由 shell新手 于 2012-04-01 17:05 编辑
dragon23452345 发表于 2012-04-01 15:59
按你给的格式就这样



再请教一下,如何把几个列合并,比如合并成这样的?
,client1,3,client,256,512,1024,1,2,4,0.1,0.2,0.4,100,10 11 12 13,10 20 30 40,,50,30 31
dragon23452345 该用户已被删除
6 [报告]
发表于 2012-04-01 17:38 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
7 [报告]
发表于 2012-04-01 17:42 |只看该作者
本帖最后由 rongpmcu 于 2012-04-01 17:42 编辑

回复 4# shell新手
我的理解是跳到标记a的地方,相当于循环了,直到条件不满足

   

论坛徽章:
0
8 [报告]
发表于 2012-04-01 20:45 |只看该作者
dragon23452345 发表于 2012-04-01 17:38
没看懂你的合并规则是什么?另外没有sed基础解释不清楚
回复 5# shell新手


,client1,3,client,256,512,1024,1,2,4,0.1,0.2,0.4,100,10,10,,50,30

,,,,,,,,,,,,,,11,20,,,

,,,,,,,,,,,,,,12,30,,50,31

,,,,,,,,,,,,,,13,40,,,


是这样的,比如client3这台机器的信息,每一行都是19个域,我希望如果域的内容是相同的就取一个,如果不同的话,就取所有的。比如client1合并之后就得到:
,client1,3,client,256,512,1024,1,2,4,0.1,0.2,0.4,100,10 11 12 13,10 20 30 40,,50,30 31

论坛徽章:
0
9 [报告]
发表于 2012-04-01 22:58 |只看该作者
本帖最后由 hbmhalley 于 2012-04-02 13:20 编辑
  1. sed -rn '/^,client1/{s/$/,/;:1;N;/,\n,\w.*/{s///p;q;};s/$/,/;G;:2;s/([^,]*),([^\n]*\n)([^,]*,)(.*)/\2\4\1 \3/;t2;s/..//;s/ (,+)/\1/g;b1;}'
复制代码

忘去重了
  1. sed -rn '/^,client1/{s/$/,/;:1;N;/\n,\w.*/{s///p;q;};s/$/,/;G;:2;s/([^,]*),([^\n]*\n)([^,]*,)(.*)/\2\4\1 \3/;s/([\n, ])([^, ]+)(( [^, ]+)*) \2,/\1\2\3,/;t2;s/..//;s/ (,+)/\1/g;b1;}
复制代码

论坛徽章:
1
辰龙
日期:2014-05-22 11:38:58
10 [报告]
发表于 2012-04-02 10:37 |只看该作者
本帖最后由 winway1988 于 2012-04-02 14:07 编辑

ls的牛叉,不过好像没去重啊,按ls的思路改了改
  1. sed -nr '/^,client1/{:b;N;/\n,[^,]/{s/\n[^\n]*$//;p;q};G;:a;s/^([^,\n]*)(,?)([^\n]*\n)([^,\n]*),?(.*)/\3\5\1 \4\2/;s/,([^,]*)([^, ]*) \2(,?)$/,\1\2\3/;/^\n\n/{s/^\n\n//;bb};ba}'
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP