shell整理(33)====改变文本内容的小题目

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell整理(33)====改变文本内容的小题目相关的知识,希望对你有一定的参考价值。

题目:linux系统中/tmp目录下有许多级子目录和文件。请编写一个程序(shell/perl/python或者任何其他语言)查找通配符log.201710*的文件,并将文件中的任何小写abc字母替换成大写ABC,生成文件保存在源目录的log.new.201710*文件中。


根据题目自己创造条件

例如我的环境:我的/tmp/下有俩目录,一个000,一个111

技术分享

看我创建的文件,我的文件中除了000中的log.201710111和111中的og.201710111有内容其他都是空的。

[[email protected] 000]# ls

log.201710111  log.201710222  log.201710333  log.201712333  log.201715333

[[email protected] 000]# 

[email protected] 111]# ls

log.201710111  log.201710222  log.201715111

[[email protected] 111]# 

例如:

[[email protected] 111]# cat log.201710111 

aaaaaaaaa

bbbbbbbbbb

cccccccccc

dddddddddd

eeeeeeee

[[email protected] 111]# 

[[email protected] 000]# cat log.201710111 

a

b

c

aaaaaaaaaaaaa

bnbbbbbbbbbbbb

dsfsagsagr

fsdf

[[email protected] 000]# 


技术分享


shell代码如下:

#!/bin/bash


a=`find /tmp/ -type f -name ‘log.201710*‘`

echo "$a" | while read line

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]‘表示括号中的任意一个。

例如:

[[email protected] 000]# cat log.201710111 

a

b

c

abc

abckjawdfalfd

a jskd bnsdjkadc

aaaaaaaaaaaaa

bnbbbbbbbbbbbb

dsfsagsagr

fsdf

[[email protected] 000]# 

[email protected] 000]# grep ‘abc‘ log.201710111 

abc

abckjawdfalfd

[[email protected] 000]# 

[[email protected] 000]# grep ‘[abc]‘ log.201710111 

a

b

c

abc

abckjawdfalfd

a jskd bnsdjkadc

aaaaaaaaaaaaa

bnbbbbbbbbbbbb

dsfsagsagr

[[email protected] 000]# 

执行结果如下:


技术分享

[[email protected] 111]# cat log.new.201710111 

AAAAAAAAA

BBBBBBBBBB

CCCCCCCCCC

dddddddddd

eeeeeeee

[[email protected] 111]# 

[[email protected] 000]# cat log.new.201710111 

A

B

C

AAAAAAAAAAAAA

BnBBBBBBBBBBBB

dsfsAgsAgr

fsdf

[[email protected] 000]# 

如果我们把这个题目改一改

题目:linux系统中/tmp目录下有许多级子目录和文件。请编写一个程序(shell/perl/python或者任何其他语言)查找通配符log.201710*的文件,并将文件中的任何"abc"字符串换成大写“ABC”,生成文件保存在源目录的log.new.201710*文件中。

shell脚本如下:

#!/bin/bash

for i in `find /tmp -type f -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

功能:从给定的包含绝对路径的文件名中,去除文件名(非目录部分),留下目录部分。

例如:

[[email protected] /]# dirname /etc/passwd

/etc

[[email protected] /]# 


本文出自 “IT生活” 博客,请务必保留此出处http://dingxue.blog.51cto.com/12290895/1970097

以上是关于shell整理(33)====改变文本内容的小题目的主要内容,如果未能解决你的问题,请参考以下文章

shell整理(34)===date 命令的小脚本

shell整理(32)===两个嵌套循环的小例子

shell笔记整理1---vim编译器基础应用(参考鸟哥)

shell整理(43)====shell脚本去重

shell 整理(27)===大小写字母替换修改文件名

牛客Shell实战题目1~8