设为首页 收藏本站
云服务器等爆品抢先购,低至4.2元/月
查看: 1046|回复: 0

shell脚本学习:不得不细心之sed和grep,sort和uniq,从细节看“认真”

[复制链接]

尚未签到

发表于 2017-5-16 11:48:20 | 显示全部楼层 |阅读模式
   今天下午忙了一个下午写一个小脚本,中间出了很多错误,发现有关sort和uniq的细节问题,而且发现了自己写脚本一些小的方面的疏忽,编程是一门讲究严禁的学问,必须一字不差,否则轻则结果错误,重则无法运行。现在把自己的这些毛病总结下!
  今天下午的脚本:
  写一个脚本:
1、下载文件ftp://192.168.0.254/pub/Files/access_log至/tmp目录;
2、分析并显示/tmp/access_log文件中位于行首的IP中出现次数最多的前5个,并说明每一个出现了多少次;
3、取出/tmp/access_log文件中以http://开头,后面紧跟着一个域名或IP地址的字符串,比如:http://www.linux.com/install/images/style.css 这个串的http://www.linux.com的部分;而后显示出现次数最多的前5个;
要求:第2、3功能各以函数的方式实现;

  #aceess_log的文件信息部分如下:
  pleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.107 Safari/534.13"
192.168.0.191 - - [24/Jul/2011:17:43:17 +0800] "GET /static/image/cr180_dzx//scrolltop.gif HTTP/1.1" 304 - "http://www.linux.com/forum.php" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.107 Safari/534.13"
192.168.0.191 - - [24/Jul/2011:17:43:17 +0800] "GET /uc_server/images/noavatar_small.gif HTTP/1.1" 304 - "http://www.linux.com/forum.php" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.107 Safari/534.13"
192.168.0.191 - - [24/Jul/2011:17:43:17 +0800] "GET /favicon.ico HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.107 Safari/534.13"
192.168.0.191 - - [24/Jul/2011:17:43:17 +0800] "GET /forum.php HTTP/1.1" 200 17354 "http://www.linux.com/group.php" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.107 Safari/534.13"
192.168.0.191 - - [24/Jul/2011:17:43:17 +0800] "GET /data/cache/style_2_common.css?o4R HTTP/1.1" 304 - "http://www.linux.com/forum.php" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.107 Safari/534.13"
192.168.0.191 - - [24/Jul/2011:17:43:17 +0800] "GET /data/cache/style_2_forum_index.css?o4R HTTP/1.1" 304 - "http://www.linux.com/forum.php" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.107 Safari/534.13"
192.168.0.191 - - [24/Jul/2011:17:43:17 +0800] "GET /static/js/common.js?o4R HTTP/1.1" 304 - "http://www.linux.com/forum.php" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.107 Safari/534.13"
192.168.0.191 - - [24/Jul/2011:17:43:17 +0800] "GET /static/image/cr180_dzx//bg.jpg HTTP/1.1" 304 - "http://www.linux.com/forum.php" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.107 Safari/534.13"
192.168.0.191 - - [24/Jul/2011:17:43:17 +0800] "GET /static/image/diy/panel-toggle.png HTTP/1.1" 304 - "http://www.linux.com/forum.php" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.107 Safari/534.13"
  我们的目的是要抓取指定的信息并且排名,这样肯定要用到正则表达式,而且是三个比较长的正则表达式,对正则表达式的书写有一定的要求,我在书写这三个正则表达式时,遇到了很多问题,根据题目的要求要用到sed命令把指定的内容抓出来并替换掉,而我出现了如下错误
  1正则表达式最后忘了加 .* 这样对这么长的行起不到替换的作用
  2在sed命令抓取后,有一些不符合要求的项也显示出来,这使用可以使用grep “http://” 去掉这些没用的行(我在这一步耽误了很长时间)
  3\{ \} 写成了\{ }\ 属于笔误,但书写较长的正则表达式是,这样的错误不可原谅,所以一定要实现把这些需要转移的括号给完成,然后在写要匹配的内容,以免错误的发生。
  4 sed 命令忘了写 ‘’中的一个,应该实现就写好‘’避免遗忘以出错
  我的第二个函数如下
function URL {sed '1,$s@.*\(http://[a-zA-Z]\{1,\}\.[a-zA-Z]\{1,\}\.[a-zA-Z]\{1,\}\).*@\1@g' /tmp/access_log | grep "^http://" > /tmp/tt.1sed '1,$s@.*\(http://[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}\).*@\1@g' /tmp/access_log | grep "^http://" >> /tmp/tt.1echo -e "  \033[33mTIMES   Doman\033[0m  \033[5;32m<---------Here is the doman rank\033[0m"sort /tmp/tt.1 | uniq -c | sort -rn | head -5}  很明显,这样长的正则表达式很容易出错,希望以后在书写sed 命令和正则表达式以及其他的命令时能吸取教训。
  sort和uniq
  这两个命令有一些特别容易忽视的问题,比如uniq命令 当使用sourt -n时,它并不是以数字大小比较,而是以首字符大小比较!(千万注意)所以,应该使用sort -rn来用数字排序。 而uniq 在处理特别的数据时,如果不用sort事先处理的话,会出现不是自己想要的结果,如下:
[iyunv@dean 725-27]# sed '1,$s@.*\(http://[a-zA-Z]\{1,\}\.[a-zA-Z]\{1,\}\.[a-zA-Z]\{1,\}\).*@\1@g' /tmp/access_log | grep "^http://" | uniq -c2 http://www.baidu.com                    //baidu在下面又出现了!11983 http://www.linux.com1 http://i.ifeng.com3761 http://www.linux.com4 http://www.baidu.com                    //重复出现!   这是因为uniq的处理机制,并不是合并全部重复的,而是连续重复的!所以正确的使用方法应该是,先将要处理的文件用sort先排序,将他们重复的排序在一起,然后用uniq处理
sort   file | uniq -c  | sort -rn  实现排序
  整个脚本的代码如下:
#!/bin/bashcd /tmpwget ftp://192.168.0.254/pub/Files/access_logecho -e "\033[32mdownload secessfull!\033[0m "echo "---------------------------------------"FILE=/tmp/access_logfunction IP {echo -e "  \033[33mTIMES   IP\033[0m  \033[5;32m<------------ Here is the ip rank\033[0m"       awk '{print $1}' $FILE | sort | uniq -c | sort -rn | head -5}function URL {sed '1,$s@.*\(http://[a-zA-Z]\{1,\}\.[a-zA-Z]\{1,\}\.[a-zA-Z]\{1,\}\).*@\1@g' /tmp/access_log | grep "^http://" > /tmp/tt.1sed '1,$s@.*\(http://[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}\).*@\1@g' /tmp/access_log | grep "^http://" >> /tmp/tt.1echo -e "  \033[33mTIMES   Doman\033[0m  \033[5;32m<---------Here is the doman rank\033[0m"sort /tmp/tt.1 | uniq -c | sort -rn | head -5}IPURLrm -f /tmp/tt.1  
##总结:在书写shell脚本的时候,一定要先思考命令的用法,在明确命令的书写格式和用法时先写那些容易出错的地方,避免书写错误。其他的需要注意的方面,比如,if语句最后的fi, if 右面紧跟的then , 循环体后的done ,最后删除缓存文件,case语句没条结束时的;; 最后的*)而不是‘*’) ,还有最后的esac等等

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-378143-1-1.html 上篇帖子: mac下ant的使用,以及使用ant上传工程和使用ant远程执行shell 下篇帖子: 我使用过的Linux命令之declare
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表