题目: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代码如下:
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 必须用双引号引起来,因为如果不加就会
就会报错,因为这个变量有回车,所以必须加双引号,如果你不想犯错,所有的变量尽量都加双引号
细节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脚本如下:
1
2
3
4
5
6
7
8
9
|
#!/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
功能:从给定的包含绝对路径的文件名中,去除文件名(非目录部分),留下目录部分。
例如:
[root@localhost /]# dirname /etc/passwd
/etc
[root@localhost /]#