呼唤shell脚本高人(有关文本处理)

sh/bash/dash/ksh/zsh等Shell脚本
头像
star
帖子: 76
注册时间: 2007-01-16 21:27
来自: 上海
送出感谢: 0
接收感谢: 0
联系:

呼唤shell脚本高人(有关文本处理)

#1

帖子 star » 2008-10-30 10:15

比如一下一段文本:

/Intel/pkgs/Snv/STEPnicdrv-1_4-1-Snv/reloc/source/src/tools/stf/contrib/logapi/README
/Intel/pkgs/Snv/STEPtcp-2_6_2-19-Snv/reloc/source/usr/ontest/README
/Intel/pkgs/Snv/STEPnfsv3-1_2_8-2-Snv/reloc/source/usr/ontest/util/stcpkgtool/nfsv2/README
/Intel/pkgs/Snv/STEPdiskomizer_hba-1_0-10-Snv/reloc/wrapper/README
/Intel/pkgs/Snv/STEPtslvm_NIGHTLY-4_9-3-Snv/reloc/source/sparc/TSmd/reloc/$ROOTSPARC/Sets/README
/Intel/pkgs/Snv/STEPsdts-1_0-10-Snv/reloc/source/src/suites/sdts/README
/Intel/pkgs/Snv/STEPagpgart-1_0-5-Snv/reloc/source/src/suites/agp/agpgart/README
/Intel/pkgs/Snv/STEPdrm-1_0-5-Snv/reloc/source/src/tools/stf/contrib/logapi/README
/Intel/pkgs/Snv/xvm/SUNWstc-virsh/reloc/README
/Intel/pkgs/Snv/STEPddivs-2_11_3-8-Snv/reloc/source/usr/ontest/README
/Intel/pkgs/Snv/STEPnfsv4_test-1_14_14-5-Snv/reloc/source/usr/ontest/util/stcpkgtool/cmgr/README

我想把这些README文件全部copy到tmp目录下去,新的命名根据每一行的第4个字段
比如第一行的/Intel/pkgs/Snv/STEPnicdrv-1_4-1-Snv/reloc/source/src/tools/stf/contrib/logapi/README
cp为/tmp/STEPnicdrv-1_4-1-Snv.README

偶用的熟的只有C,shell脚本还在学习中,不知道应该怎样做文本处理~
呼唤大侠解惑^^
_______________________________________
Ubuntu is not my all
But it makes me enjoy all my life
头像
bones7456
论坛版主
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
送出感谢: 0
接收感谢: 8 次
联系:

Re: 呼唤shell脚本高人(有关文本处理)

#2

帖子 bones7456 » 2008-10-30 10:27

代码: 全选

awk -F/ '{system("cp " $0 " /tmp/" $5 ".README")}' 你的文本文件名
关注我的blog: ε==3
yhywl
帖子: 13
注册时间: 2007-01-28 13:52
送出感谢: 0
接收感谢: 0

Re: 呼唤shell脚本高人(有关文本处理)

#3

帖子 yhywl » 2008-10-30 15:52

perl可以吗

代码: 全选

#!/usr/bin/perl -w
use strict;

foreach (`find /Intel/pkgs/Snv/ -name "README"`) {
  chomp; 
  my @aaa = spilt(/\//);
  system ("cp $_ /tmp/$aaa[4].$aaa[-1]");
}
没实验过 不保证正确
======
保险期间 就把你上面的README文件和路径放到数组里foreach吧 刚刚写时候没考虑到同一目录下不同的子目录都有README文件
头像
star
帖子: 76
注册时间: 2007-01-16 21:27
来自: 上海
送出感谢: 0
接收感谢: 0
联系:

Re: 呼唤shell脚本高人(有关文本处理)

#4

帖子 star » 2008-10-30 16:41

yhywl 写了:perl可以吗

代码: 全选

#!/usr/bin/perl -w
use strict;

foreach (`find /Intel/pkgs/Snv/ -name "README"`) {
  chomp; 
  my @aaa = spilt(/\//);
  system ("cp $_ /tmp/$aaa[4].$aaa[-1]");
}
没实验过 不保证正确
======
保险期间 就把你上面的README文件和路径放到数组里foreach吧 刚刚写时候没考虑到同一目录下不同的子目录都有README文件
运行的时候说 Undefined subroutine &main::spilt at line6 就是my @aaa = spilt(/\//);这一句吧
还应该加什么函数定义么?
_______________________________________
Ubuntu is not my all
But it makes me enjoy all my life
头像
star
帖子: 76
注册时间: 2007-01-16 21:27
来自: 上海
送出感谢: 0
接收感谢: 0
联系:

Re: 呼唤shell脚本高人(有关文本处理)

#5

帖子 star » 2008-10-30 16:45

bones7456 写了:

代码: 全选

awk -F/ '{system("cp " $0 " /tmp/" $5 ".README")}' 你的文本文件名
好像不行额~
还有,为什么是$5呢,不是第4个词吗?
_______________________________________
Ubuntu is not my all
But it makes me enjoy all my life
头像
bones7456
论坛版主
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
送出感谢: 0
接收感谢: 8 次
联系:

Re: 呼唤shell脚本高人(有关文本处理)

#6

帖子 bones7456 » 2008-10-30 16:54

star 写了:
bones7456 写了:

代码: 全选

awk -F/ '{system("cp " $0 " /tmp/" $5 ".README")}' 你的文本文件名
好像不行额~
还有,为什么是$5呢,不是第4个词吗?
不可能不行
你给出提示或者现象.
关注我的blog: ε==3
头像
star
帖子: 76
注册时间: 2007-01-16 21:27
来自: 上海
送出感谢: 0
接收感谢: 0
联系:

Re: 呼唤shell脚本高人(有关文本处理)

#7

帖子 star » 2008-10-30 17:01

为什么是$5我已经知道了,但是这样做$0也会被转换吧~
_______________________________________
Ubuntu is not my all
But it makes me enjoy all my life
头像
bones7456
论坛版主
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
送出感谢: 0
接收感谢: 8 次
联系:

Re: 呼唤shell脚本高人(有关文本处理)

#8

帖子 bones7456 » 2008-10-30 17:04

还要求你的路径里面没有空格,有空格的情况没试过.
关注我的blog: ε==3
yhywl
帖子: 13
注册时间: 2007-01-28 13:52
送出感谢: 0
接收感谢: 0

Re: 呼唤shell脚本高人(有关文本处理)

#9

帖子 yhywl » 2008-10-30 18:16

star 写了:
yhywl 写了:perl可以吗

代码: 全选

#!/usr/bin/perl -w
use strict;

foreach (`find /Intel/pkgs/Snv/ -name "README"`) {
  chomp; 
  my @aaa = spilt(/\//);
  system ("cp $_ /tmp/$aaa[4].$aaa[-1]");
}
没实验过 不保证正确
======
保险期间 就把你上面的README文件和路径放到数组里foreach吧 刚刚写时候没考虑到同一目录下不同的子目录都有README文件
运行的时候说 Undefined subroutine &main::spilt at line6 就是my @aaa = spilt(/\//);这一句吧
还应该加什么函数定义么?

不好意思 单词打错了 split
头像
star
帖子: 76
注册时间: 2007-01-16 21:27
来自: 上海
送出感谢: 0
接收感谢: 0
联系:

Re: 呼唤shell脚本高人(有关文本处理)

#10

帖子 star » 2008-10-31 9:54

bones7456 写了:
star 写了:
bones7456 写了:

代码: 全选

awk -F/ '{system("cp " $0 " /tmp/" $5 ".README")}' 你的文本文件名
好像不行额~
还有,为什么是$5呢,不是第4个词吗?
不可能不行
你给出提示或者现象.
就是运行完命令之后没有任何反应 /tmp目录下也没有任何文件生成 ;-(
_______________________________________
Ubuntu is not my all
But it makes me enjoy all my life
头像
star
帖子: 76
注册时间: 2007-01-16 21:27
来自: 上海
送出感谢: 0
接收感谢: 0
联系:

Re: 呼唤shell脚本高人(有关文本处理)

#11

帖子 star » 2008-10-31 9:55

自己写了一个 呵呵
#!/usr/bin/bash

while read line
do
echo "$line"
echo "cp $line /tmp/readme/`echo $line | awk -F/ '{print $5 ".README"}'`"
cp $line /tmp/readme/`echo $line | awk -F/ '{print $5 ".README"}'`
done < /export/result.me
_______________________________________
Ubuntu is not my all
But it makes me enjoy all my life
waynehu
帖子: 48
注册时间: 2008-11-04 17:44
送出感谢: 0
接收感谢: 1 次

Re: 呼唤shell脚本高人(有关文本处理)

#12

帖子 waynehu » 2008-11-04 17:47

star 写了:
bones7456 写了:
star 写了:
bones7456 写了:

代码: 全选

awk -F/ '{system("cp " $0 " /tmp/" $5 ".README")}' 你的文本文件名
好像不行额~
还有,为什么是$5呢,不是第4个词吗?
不可能不行
你给出提示或者现象.
就是运行完命令之后没有任何反应 /tmp目录下也没有任何文件生成 ;-(
可以运行的,我已经试过
如果不行,建议检查一下权限等问题

或者把代码里的cp改成echo来自助检查一下
头像
roylez
论坛版主
帖子: 1928
注册时间: 2005-10-04 10:59
来自: 上海
送出感谢: 0
接收感谢: 1 次

Re: 呼唤shell脚本高人(有关文本处理)

#13

帖子 roylez » 2008-11-04 18:48

我只会写loop。

代码: 全选

for i in `cat 文件名`;do cp $i /tmp/$(echo $i|awk -F/ '{print $5}').README; done
弄个dropbox空间来备份文件或者做私人代码服务器
配置:[url]git://github.com/roylez/dotfiles.git[/url]
主页:http://roylez.heroku.com
各种稀奇玩意儿:http://dooloo.info
头像
star
帖子: 76
注册时间: 2007-01-16 21:27
来自: 上海
送出感谢: 0
接收感谢: 0
联系:

Re: 呼唤shell脚本高人(有关文本处理)

#14

帖子 star » 2008-11-06 10:33

waynehu 写了:
star 写了:
bones7456 写了:
star 写了:
bones7456 写了:

代码: 全选

awk -F/ '{system("cp " $0 " /tmp/" $5 ".README")}' 你的文本文件名
好像不行额~
还有,为什么是$5呢,不是第4个词吗?
不可能不行
你给出提示或者现象.
就是运行完命令之后没有任何反应 /tmp目录下也没有任何文件生成 ;-(
可以运行的,我已经试过
如果不行,建议检查一下权限等问题

或者把代码里的cp改成echo来自助检查一下
找到一个可能的原因,我现在用的OpenSolaris 里面awk内嵌的system调用没有运行起来
用了一个很WS的方法: awk -F/ '{var="/tmp/"$5".README"; print "cp", $0, var | "/bin/bash"}' result.me 就行了
(如果是print "cp", $0, " /tmp/", $5 , ".README" 的话中间会有空格 ;-( )
_______________________________________
Ubuntu is not my all
But it makes me enjoy all my life
头像
bones7456
论坛版主
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
送出感谢: 0
接收感谢: 8 次
联系:

Re: 呼唤shell脚本高人(有关文本处理)

#15

帖子 bones7456 » 2008-11-06 10:45

star 写了: 找到一个可能的原因,我现在用的OpenSolaris 里面awk内嵌的system调用没有运行起来
用了一个很WS的方法: awk -F/ '{var="/tmp/"$5".README"; print "cp", $0, var | "/bin/bash"}' result.me 就行了
(如果是print "cp", $0, " /tmp/", $5 , ".README" 的话中间会有空格 ;-( )
汗...你早说是 OpenSolaris 嘛,awk是啥版本的?如果不是gawk的话,试试装gawk,应该就可以了.
关注我的blog: ε==3
回复

回到 “Shell脚本”