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

简介:

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


根据题目自己创造条件

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

wKioL1nQlrrxwVZ_AAAy85R0u7w906.png-wh_50

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


wKiom1nQmISwTvPTAACSBXUPUJM368.png-wh_50


shell代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/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 必须用双引号引起来,因为如果不加就会

wKioL1nQnJKhkGMmAACNI66qACs861.png-wh_50

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

细节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]# 

执行结果如下:


wKiom1nQmUvzafIzAACl1jorX2M340.png-wh_50

[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脚本如下:

1
2
3
4
5
6
7
8
9
#!/bin/bash
for  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

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

例如:

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

/etc

[root@localhost /]# 



本文转自 大雪儿 51CTO博客,原文链接:http://blog.51cto.com/dingxue/1970097,如需转载请自行联系原作者
相关文章
|
6月前
|
存储 Shell Linux
【Shell 命令集合 文档编辑】Linux 文本统计 wc命令使用指南
【Shell 命令集合 文档编辑】Linux 文本统计 wc命令使用指南
153 0
|
Linux Shell
linux shell取文本最后一行
目前我知道的方法有四种 1.awk 'END {print}'   2.sed -n '$p'   3.sed '$!N;$!D'   4.awk '{b=a"\n"$0;a=$0}END{print b}'
3009 0
|
6月前
|
Linux C语言 C++
Linux Shell_cut命令(按列提取文本字符)
Linux Shell_cut命令(按列提取文本字符)
76 0
|
6月前
|
算法 Shell Linux
【Shell 命令集合 文档编辑】Linux 文本搜索工具 grep命令使用指南
【Shell 命令集合 文档编辑】Linux 文本搜索工具 grep命令使用指南
75 4
|
6月前
|
算法 Shell Linux
【Shell 命令集合 文档编辑 】Linux 文本搜索 look 命令使用指南
【Shell 命令集合 文档编辑 】Linux 文本搜索 look 命令使用指南
71 0
|
存储 运维 Unix
shell脚本应用——文本处理器
shell脚本应用——文本处理器
100 0
|
Shell Linux Perl
Adb Shell输入带空格的文本串
Adb Shell输入带空格的文本串
348 0
|
Shell 索引 Perl
Shell 编程(六):文本三剑客之 awk(一)
awk 是一个文本处理工具,通常用于处理数据并生成结果报告,awk的命名是它的创始人 Alfred Aho、 Peter Weinberger 和 Brian Kernighan 姓氏的首个字母组成的。
134 0
|
分布式计算 资源调度 网络协议
Shell 编程(六):文本三剑客之 awk(二)
awk 是一个文本处理工具,通常用于处理数据并生成结果报告,awk的命名是它的创始人 Alfred Aho、 Peter Weinberger 和 Brian Kernighan 姓氏的首个字母组成的。
164 0
|
存储 分布式计算 关系型数据库
Shell 编程(五):文本三剑客之 sed(二)
sed(Stream Editor)是一种流编辑器,sed 是对标准输出或文件逐行进行处理。sed 会在编辑器处理数据以前基于预先提供的一组规则来编辑数据流。能够根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。
145 0