我如何根据 ip 地址对多行进行排序? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
ioiioi
V2EX    Linux

我如何根据 ip 地址对多行进行排序?

  • &nsp;
  •   ioiioi 2017-04-14 15:48:33 +08:00 5032 次点击
    这是一个创建于 3155 天前的主题,其中的信息可能已经有所发展或是发生改变。

    譬如说我有以下的多行:

    user-bind static ip-address 10.199.27.246 mac-address 00d0-d0b6-c09a vlan 7 user-bind static ip-address 10.199.27.223 mac-address f0de-f127-e980 vlan 7 user-bind static ip-address 10.199.28.26 mac-address 3c97-0ecd-7797 vlan 7 user-bind static ip-address 10.199.27.192 mac-address 0027-19a3-516d vlan 7 user-bind static ip-address 10.199.29.199 mac-address 000f-e2d2-5a38 vlan 7 user-bind static ip-address 10.199.27.98 mac-address 0090-27b6-cd8c vlan 7 user-bind static ip-address 10.199.27.124 mac-address 047d-7bd4-1eaf vlan 7 

    ip 地址有 3 个网段: 10.199.27.0/24, 10.199.28.0/24, 10.199.29.0/24 我想排列成:

    user-bind static ip-address 10.199.27.98 mac-address 0090-27b6-cd8c vlan 7 user-bind static ip-address 10.199.27.124 mac-address 047d-7bd4-1eaf vlan 7 user-bind static ip-address 10.199.27.192 mac-address 0027-19a3-516d vlan 7 user-bind static ip-address 10.199.27.223 mac-address f0de-f127-e980 vlan 7 user-bind static ip-address 10.199.27.246 mac-address 00d0-d0b6-c09a vlan 7 user-bind static ip-address 10.199.28.26 mac-address 3c97-0ecd-7797 vlan 7 user-bind static ip-address 10.199.29.199 mac-address 000f-e2d2-5a38 vlan 7 

    使用 cut 、 sort 、 awk 、 sed 能实现吗?

    34 条回复    2017-04-15 16:07:42 +08:00
    ldbC5uTBj11yaeh5
        1
    ldbC5uTBj11yaeh5  
       2017-04-14 15:52:04 +08:00
    cat 1.txt | sort -h
    msg7086
        2
    msg7086  
       2017-04-14 16:01:37 +08:00
    @jigloo sort 不能直接读文件么
    ioiioi
        3
    ioiioi  
    OP
       2017-04-14 16:02:31 +08:00
    抱歉,我用的是 babun on windows , sort -h 是起什么作用?
    ldbC5uTBj11yaeh5
        4
    ldbC5uTBj11yaeh5  
       2017-04-14 16:06:56 +08:00
    @msg7086
    习惯了

    @ioiioi
    cat 1.txt | sort -t. -k1 -k2 -k3 -k4
    ioiioi
        5
    ioiioi  
    OP
       2017-04-14 16:08:55 +08:00
    我现在的方法比较蠢:

    ```
    cat raw.txt | cut -d " " -f 4 > ip.list.txt
    cat ip.list.txt | sort -t . -k 3,3n -k 4,4n > ip.list.sorted.txt # <1>
    ```
    <1> https://www.cyberciti.biz/faq/unix-linux-shell-script-sorting-ip-addresses/

    得到的结果只是一串排序后的 ip ,剩余字符串就全部丢失了。
    Glink
        6
    Glink  
       2017-04-14 16:47:38 +08:00
    cat test.txt |sort -t. -k 3,3n -k4,4n
    直接这么写就可以了
    gouchaoer
        7
    gouchaoer  
       2017-04-14 16:50:08 +08:00
    把 ip 转化成 unsigned int ,然后快拍。。。。为啥一定要用难用的 sort cut 之类的,用熟悉的语言就 ok 了
    ioiioi
        8
    ioiioi  
    OP
       2017-04-14 16:57:19 +08:00
    @Glink wow !我直接用了 sort -t . -k 3,3n -k 4,4n source.txt > output.txt
    不过,假如有一些行的 ip 地址之前包含了“.”,而有一些行又没有的话,又该怎么处理?因为无法用-k 3 来限定排序的字段了。
    我想找一个比较通用的处理办法。
    ioiioi
        9
    ioiioi  
    OP
       2017-04-14 16:57:57 +08:00
    @gouchaoer
    :-<
    我不是程序员,只是一个普通的 linux 用户,会一点 shell 。
    ldbC5uTBj11yaeh5
        10
    ldbC5uTBj11yaeh5  
       2017-04-14 17:06:31 +08:00
    哦,那可以试下这个

    cat 1.txt | awk '{print $4" "$0}' | sort -t. -k3,3n -k4,4n | awk '{for (i=2; i<NF; i++) printf $i " "; print $NF}'
    realpg
        11
    realpg  
    PRO
       2017-04-14 17:07:08 +08:00
    EXCEL 大法好……
    gouchaoer
        12
    gouchaoer  
       2017-04-14 17:07:49 +08:00
    @ioiioi 不是码农用 linux 干嘛,那么难用
    ioiioi
        13
    ioiioi  
    OP
       2017-04-14 17:22:17 +08:00
    @realpg
    excel 比较繁琐,主要是没法在妹子面前装 13 ,:-)
    ioiioi
        14
    ioiioi  
    OP
       2017-04-14 17:22:50 +08:00
    @gouchaoer 嗯,这的确是一个问题,令我陷入了深深地思考....
    ioiioi
        15
    ioiioi  
    OP
       2017-04-14 17:28:42 +08:00
    @jigloo 我得好好消化一下,如果你能简答说明下思路更好,我大概知道 awk '{print $4" "$0}'是为了截取 ip 地址, sort 是为了排序,但是后面那个 awk 就完全不知道是干嘛了。
    ldbC5uTBj11yaeh5
        16
    ldbC5uTBj11yaeh5  
       2017-04-14 17:46:50 +08:00   1
    @ioiioi

    后面做繁琐了,这个更清楚点。

    cat 1.txt | awk '{print $4 $0}' | sort -t. -k3,3n -k4,4n | awk '{sub($1 FS,""); print}'

    你先不要执行整个,把这几个管道一个个加上,然后在执行,就能清楚这个过程了。
    realpg
        17
    realpg  
    PRO
       2017-04-14 18:02:28 +08:00
    @ioiioi #13
    一点也不繁琐
    这种问题从来都是 excel 解决 excel 处理各种增减,排序,简单算法比变成省事儿多了……
    ioiioi
        18
    ioiioi  
    OP
       2017-04-14 18:18:33 +08:00
    @jigloo got it , thanks !
    lilydjwg
        19
    lilydjwg  
       2017-04-14 18:23:04 +08:00
    @gouchaoer #7 因为只有 shell 能在一两行之内搞定这种事啊。
    lilydjwg
        20
    lilydjwg  
       2017-04-14 18:31:27 +08:00
    其实你可以用 piep ,方便好用又容易理解:

    piep -e 'from socket import inet_aton' 'pp.sortby(fn=lambda x: inet_aton(x.split()[3]))' < input

    piep 的文档: http://gfxmonk.net/dist/doc/piep/
    gouchaoer
        21
    gouchaoer  
       2017-04-14 18:59:22 +08:00 via Android
    @lilydjwg 我 php 也能在一行搞定还比你快
    gouchaoer
        22
    gouchaoer  
       2017-04-14 19:00:25 +08:00 via Android
    awk sed sort 那么难,去学它的语法用法干嘛
    GjriFeu
        23
    GjriFeu  
       2017-04-14 19:38:34 +08:00
    @gouchaoer php 咋一行搞定啊
    ioiioi
        24
    ioiioi  
    OP
       2017-04-14 21:33:40 +08:00
    @realpg
    如果在 excel 中做的话,该如何进行排序。
    要记住,每一行是一串字符串,拷贝到 excel 中将会占据一个单元格。
    realpg
        25
    realpg  
    PRO
       2017-04-14 21:41:52 +08:00
    @ioiioi #24
    额 你这 EXCEL 不及格啊……

    你说的是这个问题?点一下鼠标不就搞定了






    EXCEL 能解决大量日常的需要编程小工具批量或者循环问题 而且比写代码简单百倍
    ioiioi
        26
    ioiioi  
    OP
       2017-04-15 11:20:24 +08:00
    @realpg

    嗯,今早上试了一下, excel 有个分列的功能,但是 ip 地址的排序似乎有点问题,只能排成:

    ```
    10.199.27.124
    10.199.27.192
    10.199.27.223
    10.199.27.246
    10.199.27.98
    10.199.28.26
    10.199.29.199
    ```

    有什么解决的办法没?
    itsjoke
        27
    itsjoke  
       2017-04-15 12:02:53 +08:00
    这绑定有意义么?
    如果主机多了那不得写死了,不是有免费 ARP 吗?
    realpg
        28
    realpg  
    PRO
       2017-04-15 12:10:51 +08:00
    @ioiioi #26
    copy 出额外字段再分列排序 不动原有的
    runntuu
        29
    runntuu  
       2017-04-15 15:49:51 +08:00
    @ioiioi #26 对 ip 地址进行分割,然后对 ip 地址的第 3 段和第 4 段“自定义排序“ - ”升序”排序
    如果是解决问题的话,用 excel 这样做确实方便,倒是感觉很不 geek = =
    ioiioi
        30
    ioiioi  
    OP
       2017-04-15 15:52:47 +08:00
    @itsjoke 怎么解决这个问题?我知道 dhcp snooping 可以防止客户私设 dhcp ,但是如何方式客户手工配置 ip 导致的 ip 地址冲突?
    ioiioi
        31
    ioiioi  
    OP
       2017-04-15 15:54:30 +08:00
    @realpg 我就是把 ip 地址单独 copy 出来,但是排序的时候, excel 会将.1xx 排在.9x 之前,实际上.98 应该要排在第一的。
    realpg
        32
    realpg  
    PRO
       2017-04-15 15:57:58 +08:00
    @ioiioi #31

    我说的也是 你没理解我说的操作

    realpg
        33
    realpg  
    PRO
       2017-04-15 16:00:06 +08:00   2
    @ioiioi #31
    补充一点 其实就是你对 EXCEL 不够深入了解,思路也受限

    另外针对一下你最开始回复我的,其实 EXCEL 大师更能装 13
    编程实现学学也就会了, EXCEL 谁没有,妹子也有,用这种谁都会的东西让他们得出 “我一定是用了假的 EXCEL ”的感觉 才是装 13 的高级境界
    ioiioi
        34
    ioiioi  
    OP
       2017-04-15 16:07:42 +08:00
    @realpg #33
    有种醍醐灌顶的感觉, wow !
    的确,让妹子感觉“我一定是用了假的 excel ”,这种装 13 的感觉才是最高境界!
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     988 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 18:54 PVG 02:54 LAX 10:54 JFK 13:54
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86