shell脚本统计ip数

有统计访问用户地理位置的需求,故通过对用户访问信息中ip地址的处理,来整理出用户ip地址和地理位置

文件格式如下:

1555315829.907 ad170ef2-35bf-11e9-906b-286ed488c99f [2019-04-15T16:10:29+08:00] elb 49.69.197.165:64361
1555315830.429 ad170ef2-35bf-11e9-906b-286ed488c99f [2019-04-15T16:10:30+08:00] elb 14.30.43.217:12104

由于可从ip地址查找出地理位置信息,所以先对ip地址数据进行整理,主要的操作有去重和排序。

#!/bin/bash
path=$1;
gzip -d $path/*;
files=$(ls $path);
source_file="filename";
ans_file="filename";
for filename in $files
do
    cat $filename >> $source_file;
done
cat $source_file |awk '{print $5}'|awk -F ':' '{print $1}'|sort -g|uniq > $save_file;

得到整理好的ip地址数据后,就需要查找到它们一一对应的地理位置。
我了解到的有以下几种方法:

(1)whois 命令工具

whois 119.26.15.14
whois.png

输出信息比较多,我们可以提取自己想要的,如 grep 'country'。
但在实际使用过程中,发现其提供的部分ip地址的地理位置信息不完整,故放弃。

(2) 使用网上提供的接口

https://www.ipip.net/support/api.html
https://ip.sb/api/
...
由于是使用shell,推荐第一个接口,速度快但免费的限制次数为1000

temp=$(curl cip.cc/$ip|grep '地址'|awk '{print $3,$4}');

生成文件格式如下


image.png

为更好的查看地理位置,再使用一次sort排序整理

sort -k 2 oversea_ip_addr.txt > oversea.txt;

在实际运行脚本的过程中,发现接口返回的速度实在太慢,12000+ip实际运行了6,7个小时(ps 百兆宽带,肯定不是网速的问题)。基于目前水平,深层的原因暂时没有找到,故为了提高速度,使用shell多进程。

在shell脚本里面,直接使用 & 即可让程序在后台运行,实现方式较为简单。
唯一要注意的是,由于是多进程同时写同一个文件,有可能会出现不同进程同时写入导致乱序或者其他意外情况,所以在这里,我们要使用文件锁,shell脚本对应的命令为 flock 。详细使用方法可以使用man 来查询

(
         flock -n 9 || exit 1
         # ... commands executed under lock ...
       ) 9>/var/lock/mylockfile
              The form is convenient inside shell scripts.   The  mode  used  to  open  the  file
              doesn't matter to flock; using > or >> allows the lockfile to be created if it does
              not already exist, however, write permission is required.  Using  <  requires  that
              the file already exists but only read permission is required.

在这里()后面的内容是先与()里面的内容执行的,“9>/var/lock/mylockfile” 代表的是 文件描述符 与 mylockfile文件写关联,若mylockfile不存在则新建。()里面的数字9即代表文件描述符。

编写完成多进程执行脚本的时候,开启10个进程理论上来说速度应该能达到原来的10倍,实际上只有2倍左右,具体原因待查找。

batch=$1;
process=$2;

path="/mnt/hgfs/共享文件夹/";
source_file=$path"ans.txt";
CN_save_file=$path"CN_ip_addr.txt";
HK_MO_TW_save_file=$path"HK_MO_TW_ip_addr.txt";
oversea_save_file=$path"oversea_ip_addr.txt";

CNlock="/tmp/cn.lock";
HMTlock="/tmp/hmt.lock";
oslock="/tmp/os.lock";

line=$(wc -l $source_file|awk '{print $1}');

startline=$((1+(batch-1)*line/process));
if [ "$batch" == "$process" ];then
        endline=$line;
else
        endline=$((batch*line/process));
fi

ip_total=$(sed -n ${startline},${endline}p $source_file);

for ip in $ip_total
do
        temp=$(curl --max-time 5 cip.cc/$ip|grep '地址'|awk '{print $3,$4}');
        while [ "$temp" == "" ]
        do
                temp=$(curl --max-time 15 cip.cc/$ip|grep '地址'|awk '{print $3,$4}');
        done
        country=$(echo $temp|awk '{print $1}');
        province=$(echo $temp|awk '{print $2}');
        if [ "$country" == "中国" ];then
                case $province in
                        "香港")
                                (
                                flock -w 10 101
                                echo $ip $province >> $HK_MO_TW_save_file
                                )101<>/tmp/hmt.lock
                                ;;
                        "台湾")
                                (
                                flock -w 10 101
                                echo $ip $province >> $HK_MO_TW_save_file
                                )101<>/tmp/hmt.lock
                                ;;
                        "澳门")
                                (
                                flock -w 10 101
                                echo $ip $province >> $HK_MO_TW_save_file
                                )101<>/tmp/hmt.lock
                                ;;
                        *)
                                (
                                flock -w 10 100
                                echo $ip $province >> $CN_save_file
                                )100<>/tmp/cn.lock
                                ;;
                esac
        else
                (
                flock -w 10 102
                echo $ip $country >> $oversea_save_file
                )102<>/tmp/os.lock
        fi

done
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容