shell整理(33)====改变文本内容的小题目
题目:linux系统中/tmp目录下有许多级子目录和文件。请编写一个程序(shell/perl/python或者任何其他语言)查找通配符log.201710*的文件,并将文件中的任何小写abc字母替换成大写ABC,生成文件保存在源目录的log.new.201710*文件中。 根据题目自己创造条件 例如我的环境:我的/tmp/下有俩目录,一个000,一个111 看我创建的文件,我的文件中除了000中的log.201710111和111中的og.201710111有内容其他都是空的。 [root@localhost 000]# ls log.201710111 log.201710222 log.201710333 log.201712333 log.201715333 [root@localhost 000]# ot@localhost 111]# ls log.201710111 log.201710222 log.201715111 [root@localhost 111]# 例如: [root@localhost 111]# cat log.201710111 aaaaaaaaa bbbbbbbbbb cccccccccc dddddddddd eeeeeeee [root@localhost 111]# [root@localhost 000]# cat log.201710111 a b c aaaaaaaaaaaaa bnbbbbbbbbbbbb dsfsagsagr fsdf [root@localhost 000]# shell代码如下: #!/bin/bash a=`find/tmp/-typef-name'log.201710*'` echo"$a"|whilereadline do c=`echo$line|awk-F'[/]+''{print$3}'` e=`echo$line|awk-F'[/.]+''{print$5}'` b=`cat$line|grep'[abc]'` if[!-z"$b"];then #echo$line|sed's/abc/ABC/g'>>/tmp/$c/log.new.$e cat$line|tr'abc''ABC'>/tmp/$c/log.new.$e fi done 虽然只有简单的几行代码,但是有一些细节问题。例如if那$b 必须用双引号引起来,因为如果不加就会 就会报错,因为这个变量有回车,所以必须加双引号,如果你不想犯错,所有的变量尽量都加双引号 细节2:sed 和 tr 的用法是不一样的,有没有发现一个用的追加,一个用的覆盖。 细节3:第二行,a 必须用双引号引起来,变量没有在一行 细节4:第六行,grep 'abc' 表示连续的abc字符串,而grep '[abc]'表示括号中的任意一个。 例如: [root@localhost 000]# cat log.201710111 a b c abc abckjawdfalfd a jskd bnsdjkadc aaaaaaaaaaaaa bnbbbbbbbbbbbb dsfsagsagr fsdf [root@localhost 000]# oot@localhost 000]# grep 'abc' log.201710111 abc abckjawdfalfd [root@localhost 000]# [root@localhost 000]# grep '[abc]' log.201710111 a b c abc abckjawdfalfd a jskd bnsdjkadc aaaaaaaaaaaaa bnbbbbbbbbbbbb dsfsagsagr [root@localhost 000]# 执行结果如下: [root@localhost 111]# cat log.new.201710111 AAAAAAAAA BBBBBBBBBB CCCCCCCCCC dddddddddd eeeeeeee [root@localhost 111]# [root@localhost 000]# cat log.new.201710111 A B C AAAAAAAAAAAAA BnBBBBBBBBBBBB dsfsAgsAgr fsdf [root@localhost 000]# 如果我们把这个题目改一改 题目:linux系统中/tmp目录下有许多级子目录和文件。请编写一个程序(shell/perl/python或者任何其他语言)查找通配符log.201710*的文件,并将文件中的任何"abc"字符串换成大写“ABC”,生成文件保存在源目录的log.new.201710*文件中。 shell脚本如下: #!/bin/bash foriin`find/tmp-typef-name"log.201710*"` do str=`grep'abc'$i` if[!-z"$str"];then sed's/abc/ABC/g'$i>`dirname$i`/log.new.`echo$i|awk-F'.''{print$NF}'` fi done ~ linux dirname 命令: 用法: dirname filename 功能:从给定的包含绝对路径的文件名中,去除文件名(非目录部分),留下目录部分。 例如: [root@localhost /]# dirname /etc/passwd /etc [root@localhost /]# (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |