UNIX系统引入了许多创新的程序和技能,但一贯以来遵照的也是行之有效的只有该软件哲学思想。所有UNIX程序基本上都可以独立地完成噜苏的事情,而且长于和其他程序结合利用,成为通用且有用的工具。
本文中我们就来先容一个Unix下强大的,而且专门卖力程序之间协作的工具管道。
管道是Unix体系中进程间的主要通信机制之一。管道的事理很大略:在内存中创建一个共享文件,通信的进程之间通过该共享文件来交流信息。该共享文件就叫是管道。管道由pipe函数创建,并且供应一个单向数据流。

一个范例的shell命名行who|sort|lp
上面命令行中的|便是管道,利用管道我们把who的实行结果通报给了sort进行排序,然后再把排序的结果通报给lp打印出来。
管道实例统计访问日志中造孽访问最高的IP
Web网站的的访问日志常日能反响网站当前访问状态,比如大量404状态比例解释网站链接系统有问题问题指向了很多不存在的网站,或者还有一个可能便是网站被人考试测验渗透,有人可能利用扫描器对你网站做特色渗透(考试测验访问一些Url),这时候就须要我们能找出这些IP并对其进行封禁。
要找出这样的IP常用的一个命令是:
grep 404 access.log|awk '{print $1}'|sort|uniq -c|sort -nr|head -n 10
以上命令行中有5个管道把6个工具处理链接成了一个处理栈:
1 用grep搜索access.log文件中的404状态。
2 用awk打印搜索结果中(404状态的访问日志)的,第一列(默认用空格字符分割,第一列即访问IP)。
3 用sort对所有IP排序,这次sort是为了下一步的uniq打根本,由于uniq只会比较附近行,以是不预先排序的话,结果会有问题。
4 uniq -c 对重复项(IP)进行去重,并计数。
5 对uniq的结果进行排序-n表示用数字排序(即uniq -c后的重复计数值),-r表示逆序。
6 取排序结果的前10项目。
结果如上,个中访问最高的IP比较不正常。我们在grep这个IP
grep 1.69.180.223 access.log
可见这便是一个扫描器,在不断地探测phpmyadmin呢,这个IP可以封掉,封禁也大略。
iptables -I INPUT -s 1.69.180.223 -j DROP
以上便是一个大略的利用管道和小工具进行日志剖析和恶意攻击创造和处理的过程,全体流程大略明了。
git仓库commit排行榜
我们再举个大略例子,对一个git托管的项目获取其提交的排序,根据提交者commit数来进行排序。我们以Linux内核为例,我们先从gitee的linux内核仓库镜像克隆一个到本地
git clone git@gitee.com:mirrors/linux.git
git log用于显示提交日志。--format=<format>选项用来对显示的信息进行筛选,本例中我们只需提交者,用--format='%an'会显示每次提交的姓名。
接着我们要对其去重统计次数,用上一例中我们说过的技巧,先sort,再uniq -c
git log --format='%an' | sort | uniq -c
故意思的是,内核中也有一些中文姓名提交者,这些人中有没有你或者你认识的?
然后根据统计的commit数排序,取前20个提交者: sort -nr | head -n 20
git log --format='%an' | sort | uniq -c |sort -nr | head -n 20
可以看到教主Linus是No.1的提交者,提交次数为30218,其次是David S. Miller,比拟gitee Web页面的commit统计
可能由于他的统计不是实时的有缓存,以是数量上有些差异。
调用github Api接口获取自己项目Github中常见一个操作便是把fork当收藏,这样一来过一段韶光后,可能项目就很多无法管理了。好在github供应了API接口,我们可以调用该接口获取干系信息,比如要获取某个用户的仓库列表,可以调用
api.github /users/用户名/repos
结果是一个json格式的数据,为理解析数据须要用到我们之前先容过的jq工具。
curl https://api.github.com/users/bollwarm/repos | jq '.[] | .full_name'
jq命令中的.[]表示对列表进行循环获取,.full_name表示获取json的全名:
jq利用管道从标准输入中读取数据,实际上所有这类API的操作都可以以类似形式处理。
总结本文中我们先容了Unix哲学思想武装下的工具管道,并实例先容了其用法,现实中还有大量的用法。抛砖引玉,希望大家善用这些小工具,来完美的办理自己的大问题。