说明:本文为老男孩linux培训某节课前考试试题及答案分享博文内容的一部分,也是独立成题的,你可以点下面地址查看全部的内容信息。
http://oldboy.blog.51cto.com/2561410/791245
特别说明:答题的思路技巧可能比做题本身更重要,这也是老男孩特别教导学生的学习方法。

5.查找当前目录下所有文件,并把文件中的www.etiantian.org字符串替换成www.oldboy.cc

解答:

通过find命令查找,然后通过-exec参数调用sed命令完成替换

find . -type f -exec sed -i 's/www\.etiantian\.org/oldboy\.cc/g'{} \;

#→这个命令是错误的语法,仅结尾{}前少了个空格,细节决定成败啊!

find . -type f -exec sed -i 's/www\.etiantian\.org/oldboy\.cc/g' {} \;

#→这个命令是正确的语法,点号为特殊字符,使用\来转义(除去特殊字符代表的特殊含义,使用其本身的原始意义)。对于本题可以不用转义。

find . -type f -exec sed -i 's/www.oldboy.cc/www.etiantian.org/g' {} \; #→此处不转义也可以。

find . -type f -exec sed -i 's#www.etiantian.org#www.oldboy.cc#g' {} \;

说明:此题考察find,sed命令的组合使用,是非常常用,好用的两个命令,必须精通之。

案例实践:

[root@oldboy test]# echo www.etiantian.org >test.txt #→创建测试文件,录入wwww.etiantian.org

[root@oldboy test]# echo www.etiantian.org >ett.txt #→创建测试文件,录入wwww.etiantian.org

[root@oldboy test]# cat test.txt ett.txt 

www.etiantian.org

www.etiantian.org

[root@oldboy test]# ls 

ett.txt  test.txt

[root@oldboy test]# find . -type f -exec sed -i 's/www.etiantian.org/oldboy.cc/g' {} \;

#→查找当前目录(点表示当前目录),所有文件,然后把文件中的www.etiantian.org的字符串,替换为oldboy.cc

[root@oldboy test]# cat ett.txt test.txt

oldboy.cc#→修改后的结果,原来是www.etiantian.org

oldboy.cc

[root@oldboy test]# find . -type f -exec sed -i 's#oldboy.cc#www.etiantian.org#g' {} \;

[root@oldboy test]# cat ett.txt test.txt

www.etiantian.org #→修改后的结果,刚刚是oldboy.cc

www.etiantian.org

如果是语法错误就会出现如下提示:

[root@oldboy test]# find . -type f -exec sed -i 's#oldboy.cc/www.etiantian.org/g'{} \;

sed: -e expression #1, char 40: unterminated `s' command

sed: -e expression #1, char 41: unterminated `s' command

[root@oldboy test]# find . -type f -exec sed -i 's#oldboy.cc/www.etiantian.org/g' {}\;

find: missing argument to `-exec'

正确错误命令对比:

find . -type f -exec sed -i 's#oldboy.cc/www.etiantian.org/g'{} \; #→错误命令

find . -type f -exec sed -i 's#oldboy.cc/www.etiantian.org/g' {}\; #→错误命令

find . -type f -exec sed -i 's#oldboy.cc#www.etiantian.org#g' {} \; #→正确命令,大括号前后各多了个空格,这也是find命令的语法写法。

参考man find帮助案例:

EXAMPLES

       find /tmp -name core -type f -print | xargs /bin/rm -f

       Find  files named core in or below the directory /tmp and delete them.  Note that this will work incorrectly if there are any filenames containing newlines, single or double quotes, or spaces.

       find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f

       Find files named core in or below the directory /tmp and delete them, processing filenames in such a  way  that file  or  directory  names  containing  single or double quotes, spaces or newlines are correctly handled.  The  -name test comes before the -type test in order to avoid having to call stat(2) on every file.

       find . -type f -exec file '{}' \;

例:查看找所有文件并查看文件类型

[root@oldboy test]# find . -type f -exec file '{}' \;

./ett.txt: ASCII text

./test.txt: ASCII text

[root@oldboy test]# find . -type f -exec file {} \;

./ett.txt: ASCII text

./test.txt: ASCII text

学生典型答案:

答案1

解答: # grep "www.etiantian.org"  * |tr "www.etiantian.org"  oldboy.cc

老男孩老师点评:这是错误答案。

答案2

find . -type f |sed -i s/www.ethiantian.org/www.oldboy.cc/g

老男孩老师点评:这是不规范的正确答案,加引号比较好。

答案3

find . -type f |xargs sed -i s/www.ethiantian.org/www.oldboy.cc/g

老男孩老师点评:此答案思路也可以,注意加引号。

生产环境正式案例:

这是一个几年前老男孩老师给一家IT公司做技术顾问时遇到的一个实际问题,情况是:

一个lamp的服务器,站点目录下所有文件均被植入了如下内容:

包括图片文件也被植入了,网站打开时就会调用这个地址,造成的影响很恶劣。

    虽然问题现在看起来简单,但当时该公司的两个linux运维花了很久都没搞定,后来给老男孩电话。5分钟内搞定。

实际解决办法:

    思路是:需要遍历所有目录所有文件 把以上被植入的内容删除掉。

实践演示:

[root@oldboy test]# cat guanggao.txt  #→模拟被窜改的文件,多个。

处理命令:

法一:

[root@oldboy test]#find . -type f -exec sed -i 's###g' {} \;

#→就是本题的命令使用方法。

法二:

find sed删除 正则

匹配:?google_ad ,包含字符串?google_ad的内容的行删除。

[root@oldboy oldboy]# find . -type f -exec sed -i '/^.*\?google_ad/d' {} \;

 特别提示:法二的方法,容易把程序里的其他正常内容删除掉,匹配关键字很重要,因此不建议使用法二。

如果用完整匹配删除则很麻烦:

find . -type f -exec sed -i '/