免费注册 查看新帖 |

Chinaunix

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

[文本处理] 如何用最简单的循环实现 [复制链接]

论坛徽章:
6
程序设计版块每日发帖之星
日期:2015-12-05 06:20:00数据库技术版块每日发帖之星
日期:2016-02-06 06:20:00数据库技术版块每日发帖之星
日期:2016-03-07 06:20:00程序设计版块每日发帖之星
日期:2016-06-04 06:20:00黑曼巴
日期:2017-02-06 16:31:2615-16赛季CBA联赛之广夏
日期:2017-05-07 09:02:07
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-03-24 08:43 |只看该作者 |倒序浏览
各很长时间,各位前辈,遇到了如下问题,第一个已经解决但是不是最优解,第二个有思路但是不知道如何实现,
还希望各位熟悉shell的前辈给些指点,帮助解答第二个,看看第一个还有没有比我的法子更快速简单的,在这先谢谢大家了,thanks~

整体问题如下:有一个文件,需要用户填写需要得worker ID,之后根据填写的ID个数完成如“server读取rver1=ID1,server2=ID2”形式的文件写入,之后将读取的ID个数分发到各个worker节点,如果用过zookeeper的前辈会知道这个过程就是完成zookeeper的自动化配置分配的过程,将这个过程细分分为两个过程,如下:

文件内容如下:
slaves 文件内容
s001
s002
s003


需要实现将上面的内容按照如下写入到文件zoo.cgf:
server1=s001
server2=s002
server3=s003

之后还需要根据server的数目将 每个slaves对应的server$id 传到对应的slave节点上,就是将server1写入名为“id”的文件并传给s001,server2写入名为"id"的文件传到s002,以此类推,实现在s001中可以找到名为id的文件,文件内容为server1,s002上可以找到同样名为id的文件,内容为server2

步骤一,将slaves写入到zoo.cgf
我的实现如下,嵌套循环用的不好,只能用如下比较笨的方法实现,让大家见笑了,同时希望熟悉的前辈给些指点和优化,多谢了。
c.sh脚本内容如下
awk 'END{print NR}' slaves > number
i=1
while [ $i -le `cat number` ]
do
    echo server.$i=
    let i+=1
done


p.sh脚本内容如下
for zp in `cat slaves`
do
    echo $zp
done


之后对两个循环的结果处理合并成如下:
server1=s001
server2=s002
server3=s003

步骤二,分配各个自己的id内容到各个节点
将id分发到各个slave节点,这个虽然有思路,知道传递的方法就是分别将server1传到s001,server2传到s002,但是不知道怎么实现,还希望大家多帮忙,多谢谢。









论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
2 [报告]
发表于 2016-03-24 08:54 |只看该作者
本帖最后由 jason680 于 2016-03-24 08:55 编辑

回复 1# 夏洛特猫

$ awk '{print "server"NR"="$1 > "zoo.cgf"}' slaves

$ cat zoo.cgf
server1=s001
server2=s002
server3=s003

   

论坛徽章:
29
程序设计版块每日发帖之星
日期:2016-02-29 06:20:0015-16赛季CBA联赛之天津
日期:2016-08-10 10:33:1115-16赛季CBA联赛之深圳
日期:2016-08-17 15:07:2015-16赛季CBA联赛之佛山
日期:2016-11-07 11:33:5015-16赛季CBA联赛之广夏
日期:2016-11-15 09:13:31CU十四周年纪念徽章
日期:2016-11-24 14:12:25极客徽章
日期:2016-12-07 14:03:4015-16赛季CBA联赛之深圳
日期:2016-12-07 17:15:2715-16赛季CBA联赛之北京
日期:2016-12-22 09:30:0115-16赛季CBA联赛之深圳
日期:2016-12-22 10:49:2115-16赛季CBA联赛之山西
日期:2017-02-10 09:05:3215-16赛季CBA联赛之同曦
日期:2017-02-27 14:19:08
3 [报告]
发表于 2016-03-24 09:02 |只看该作者
本帖最后由 elu_ligao 于 2016-03-24 09:03 编辑
  1. awk '{id=+substr($0,2); print "server"id"="$1 > "zoo.cfg"}' slaves

  2. 第二个可以用 scp 传过去
复制代码

评分

参与人数 1信誉积分 +5 收起 理由
Windows19 + 5

查看全部评分

论坛徽章:
6
程序设计版块每日发帖之星
日期:2015-12-05 06:20:00数据库技术版块每日发帖之星
日期:2016-02-06 06:20:00数据库技术版块每日发帖之星
日期:2016-03-07 06:20:00程序设计版块每日发帖之星
日期:2016-06-04 06:20:00黑曼巴
日期:2017-02-06 16:31:2615-16赛季CBA联赛之广夏
日期:2017-05-07 09:02:07
4 [报告]
发表于 2016-03-24 09:24 |只看该作者
回复 3# elu_ligao
谢谢您的回复,第二个如果使用scp 只能每个节点传内容一样的id,需要实现的是每个节点对应的id内容是不同的。

   

论坛徽章:
6
程序设计版块每日发帖之星
日期:2015-12-05 06:20:00数据库技术版块每日发帖之星
日期:2016-02-06 06:20:00数据库技术版块每日发帖之星
日期:2016-03-07 06:20:00程序设计版块每日发帖之星
日期:2016-06-04 06:20:00黑曼巴
日期:2017-02-06 16:31:2615-16赛季CBA联赛之广夏
日期:2017-05-07 09:02:07
5 [报告]
发表于 2016-03-24 09:31 |只看该作者
回复 2# jason680
。。。jason哥,你和6神的多次帮助我都不要意思了。。。以为可以跳过awk和sed没想到还是通过awk的函数实现是最简单的,麻烦您了,我的只是还是不到位,jason哥那对于第二个步骤,就是将内容分别分发到对应的节点,根据server的数目将 每个slaves对应的server$id 传到对应的slave节点上,就是将server1写入名为“id”的文件并传给s001,server2写入名为"id"的文件传到s002,以此类推,实现在s001中可以找到名为id的文件,文件内容为server1,s002上可以找到同样名为id的文件,内容为server2
就是如何利用scp 将对应的文件内容分发到对应的节点 ,这个的实现不知道您有何想法,谢谢您对于菜鸡的我的一直帮助。


论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
6 [报告]
发表于 2016-03-24 10:01 |只看该作者
回复 5# 夏洛特猫


请给 scp command

论坛徽章:
6
程序设计版块每日发帖之星
日期:2015-12-05 06:20:00数据库技术版块每日发帖之星
日期:2016-02-06 06:20:00数据库技术版块每日发帖之星
日期:2016-03-07 06:20:00程序设计版块每日发帖之星
日期:2016-06-04 06:20:00黑曼巴
日期:2017-02-06 16:31:2615-16赛季CBA联赛之广夏
日期:2017-05-07 09:02:07
7 [报告]
发表于 2016-03-24 10:35 |只看该作者
回复 6# jason680
麻烦jason哥了,scp需要实现的如下:分别将不同的文件传输到对应的slave节点,
文件内容
server1=s001
server2=s002
server3=s003

需要自动统计server的数字,例如s001对应的id为1,则本地生成个id文件,将1写入到id这个文件中,并完成scp -r  id s002:/home/ 的传输,节点s002的传输也同理,要现在本地将对应的server号2写入到id文件,并利用scp 将id=2的文件传送到s002上,节点3,或者更多节点分配也同上。
具体操作
传输文件:id
就是向s001传送对应内容为server1的id文件,向s002传送对应内容为server2的id文件,id文件在每次传输中都会写入对应工作节点的server号


不知道这样表述您能明白些吗,jason哥

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
8 [报告]
发表于 2016-03-24 10:53 |只看该作者
回复 7# 夏洛特猫

$ cat zoo.cgf
server1=s001
server2=s002
server3=s003

$ awk -vrun=0 -F= 'match($0,/server([0-9]+)/,a){cmd="echo "a[1]" > id; scp -r id "$2":/home/";print cmd;if(run)system(cmd)}' zoo.cgf
echo 1 > id; scp -r id s001:/home/
echo 2 > id; scp -r id s002:/home/
echo 3 > id; scp -r id s003:/home/

Note: please set run=1 to run the "echo" and "scp" command

评分

参与人数 1信誉积分 +5 收起 理由
Windows19 + 5

查看全部评分

论坛徽章:
6
程序设计版块每日发帖之星
日期:2015-12-05 06:20:00数据库技术版块每日发帖之星
日期:2016-02-06 06:20:00数据库技术版块每日发帖之星
日期:2016-03-07 06:20:00程序设计版块每日发帖之星
日期:2016-06-04 06:20:00黑曼巴
日期:2017-02-06 16:31:2615-16赛季CBA联赛之广夏
日期:2017-05-07 09:02:07
9 [报告]
发表于 2016-03-24 10:59 |只看该作者
回复 8# jason680  谢jason哥


   

论坛徽章:
6
程序设计版块每日发帖之星
日期:2015-12-05 06:20:00数据库技术版块每日发帖之星
日期:2016-02-06 06:20:00数据库技术版块每日发帖之星
日期:2016-03-07 06:20:00程序设计版块每日发帖之星
日期:2016-06-04 06:20:00黑曼巴
日期:2017-02-06 16:31:2615-16赛季CBA联赛之广夏
日期:2017-05-07 09:02:07
10 [报告]
发表于 2016-03-24 17:52 |只看该作者
本帖最后由 夏洛特猫 于 2016-03-24 17:52 编辑

自己提供一个shell实现方法如下:
awk 'END{print NR}' slaves > nu
i=1
while [ $i -lt `cat nu` ]
do
echo $i > myid
for l in `cat slaves`
do
  scp -r myid $l:/home/
  let i+=1
  echo $i > myid
done
done

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP