V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
ioiioi
V2EX  ›  Linux

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

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

    譬如说我有以下的多行:

    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  
       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  
       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  
       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  
       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  
       2017-04-15 15:57:58 +08:00
    @ioiioi #31

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

    realpg
        33
    realpg  
       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   ·   实用小工具   ·   2640 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 02:47 · PVG 10:47 · LAX 18:47 · JFK 21:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.