天天看点

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

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

根据题目自己创造条件

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

<a href="https://s2.51cto.com/wyfs02/M02/A6/7F/wKioL1nQlrrxwVZ_AAAy85R0u7w906.png-wh_500x0-wm_3-wmp_4-s_4264954184.png" target="_blank"></a>

看我创建的文件,我的文件中除了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 000]# cat log.201710111 

a

b

c

aaaaaaaaaaaaa

bnbbbbbbbbbbbb

dsfsagsagr

fsdf

<a href="https://s2.51cto.com/wyfs02/M01/07/CE/wKiom1nQmISwTvPTAACSBXUPUJM368.png-wh_500x0-wm_3-wmp_4-s_2167538975.png" target="_blank"></a>

shell代码如下:

<code>#!/bin/bash</code>

<code>a=`</code><code>find</code> <code>/tmp/</code> <code>-</code><code>type</code> <code>f -name </code><code>'log.201710*'</code><code>`</code>

<code>echo</code> <code>"$a"</code> <code>| </code><code>while</code> <code>read</code> <code>line</code>

<code>do</code>

<code>c=`</code><code>echo</code> <code>$line |</code><code>awk</code> <code>-F </code><code>'[/]+'</code> <code>'{print $3 }'</code><code>`</code>

<code>e=`</code><code>echo</code> <code>$line |</code><code>awk</code> <code>-F </code><code>'[/.]+'</code> <code>'{print $5 }'</code><code>`</code>

<code>b=`</code><code>cat</code> <code>$line | </code><code>grep</code> <code>'[abc]'</code><code>`</code>

<code>if</code> <code>[ ! -z </code><code>"$b"</code> <code>];</code><code>then</code>

<code> </code><code>#echo $line |sed 's/abc/ABC/g'  &gt;&gt;/tmp/$c/log.new.$e</code>

<code>cat</code> <code>$line | </code><code>tr</code> <code>'abc'</code> <code>'ABC'</code> <code>&gt;</code><code>/tmp/</code><code>$c</code><code>/log</code><code>.new.$e</code>

<code>fi</code>

<code>done</code>

虽然只有简单的几行代码,但是有一些细节问题。例如if那$b 必须用双引号引起来,因为如果不加就会

<a href="https://s4.51cto.com/wyfs02/M01/A6/7F/wKioL1nQnJKhkGMmAACNI66qACs861.png-wh_500x0-wm_3-wmp_4-s_1175794498.png" target="_blank"></a>

就会报错,因为这个变量有回车,所以必须加双引号,如果你不想犯错,所有的变量尽量都加双引号

细节2:sed 和 tr 的用法是不一样的,有没有发现一个用的追加,一个用的覆盖。

细节3:第二行,a 必须用双引号引起来,变量没有在一行

细节4:第六行,grep 'abc' 表示连续的abc字符串,而grep '[abc]'表示括号中的任意一个。

abc

abckjawdfalfd

a jskd bnsdjkadc

oot@localhost 000]# grep 'abc' log.201710111 

[root@localhost 000]# grep '[abc]' log.201710111 

执行结果如下:

<a href="https://s3.51cto.com/wyfs02/M02/07/CE/wKiom1nQmUvzafIzAACl1jorX2M340.png-wh_500x0-wm_3-wmp_4-s_1189063789.png" target="_blank"></a>

[root@localhost 111]# cat log.new.201710111 

AAAAAAAAA

BBBBBBBBBB

CCCCCCCCCC

[root@localhost 000]# cat log.new.201710111 

A

B

C

AAAAAAAAAAAAA

BnBBBBBBBBBBBB

dsfsAgsAgr

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

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

shell脚本如下:

<code>for</code> <code>i </code><code>in</code> <code>`</code><code>find</code> <code>/tmp</code> <code>-</code><code>type</code> <code>f -name </code><code>"log.201710*"</code><code>`</code>

<code>        </code><code>str=`</code><code>grep</code> <code>'abc'</code> <code>$i`</code>

<code>        </code><code>if</code> <code>[ ! -z </code><code>"$str"</code> <code>];</code><code>then</code>

<code>                </code><code>sed</code> <code>'s/abc/ABC/g'</code> <code>$i &gt;`</code><code>dirname</code> <code>$i`</code><code>/log</code><code>.new.`</code><code>echo</code> <code>$i |</code><code>awk</code> <code>-F</code><code>'.'</code> <code>'{print $NF}'</code><code>`</code>

<code>        </code><code>fi</code>

<code>~</code>

linux dirname 命令:

用法: dirname filename

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

[root@localhost /]# dirname /etc/passwd

/etc

[root@localhost /]# 

本文转自 大雪儿 51CTO博客,原文链接:http://blog.51cto.com/dingxue/1970097,如需转载请自行联系原作者

继续阅读