【问题标题】:Cleaning up IP output on command line [duplicate]在命令行上清理 IP 输出[重复]
【发布时间】:2016-10-30 04:24:18
【问题描述】:

我的输出 L 选项有问题(“grep-able”输出);例如,它输出:

| 14.138.12.21:123   | unknown                   | disabled    |
| 14.138.184.122:123 | unknown                   | disabled    |
| 14.138.179.27:123  | unknown                   | disabled    |
| 14.138.20.65:123   | unknown                   | disabled    |
| 14.138.12.235:123  | unknown                   | disabled    |
| 14.138.178.97:123  | unknown                   | disabled    |
| 14.138.182.153:123 | unknown                   | disabled    |
| 14.138.178.124:123 | unknown                   | disabled    |
| 14.138.201.191:123 | unknown                   | disabled    |
| 14.138.180.26:123  | unknown                   | disabled    |
| 14.138.13.129:123  | unknown                   | disabled    |

上面的内容既不可读也不容易理解。

如何使用 Linux 命令行实用程序,例如sed、awk 或 grep,使用上面的文件输出如下内容?

输出

14.138.12.21
14.138.184.122
14.138.179.27
14.138.20.65
14.138.12.235

【问题讨论】:

标签: bash awk sed output


【解决方案1】:

使用awk 和字段分隔符作为空格,并使用: 并获取第二个字段:

awk -F '[ :]' '{print $2}' file.txt

示例:

% cat file.txt
| 14.138.12.21:123   | unknown                   | disabled    |
| 14.138.184.122:123 | unknown                   | disabled    |
| 14.138.179.27:123  | unknown                   | disabled    |
| 14.138.20.65:123   | unknown                   | disabled    |
| 14.138.12.235:123  | unknown                   | disabled    |
| 14.138.178.97:123  | unknown                   | disabled    |
| 14.138.182.153:123 | unknown                   | disabled    |
| 14.138.178.124:123 | unknown                   | disabled    |
| 14.138.201.191:123 | unknown                   | disabled    |
| 14.138.180.26:123  | unknown                   | disabled    |
| 14.138.13.129:123  | unknown                   | disabled    |

% awk -F '[ :]' '{print $2}' file.txt
14.138.12.21
14.138.184.122
14.138.179.27
14.138.20.65
14.138.12.235
14.138.178.97
14.138.182.153
14.138.178.124
14.138.201.191
14.138.180.26
14.138.13.129

【讨论】:

    【解决方案2】:

    AWK 非常适合您想按“列”拆分文件的情况,并且您确切地知道值/列的顺序是恒定的。 AWK 通过字段分隔符(可以是像'[: ]' 这样的正则表达式)分割行。列名可从左侧按其位置访问:$1$2$3 等:

    awk -F '[ :]' '{print $2}' src.log
    awk -F '[ :|]' '{print $3}' src.log
    awk 'BEGIN {FS="[ :|]"} {print $3}' src.log
    

    您还可以使用正则表达式过滤行:

    awk -F '[ :]' '/138\.179\./ {print $2}' src.log
    

    但是,它是impossible to capture substrings with the regular expression groups

    SED 在正则表达式方面更加灵活:

    sed -r 's/^[^0-9]*([0-9\.]+)\:.*/\1/' src.log
    

    但是,它缺少我们在日常编程中使用的类 Perl 正则表达式的许多有用功能。例如,即使是扩展语法 (-r) 也无法将 \d 解释为数字。

    也许,Perl 是解析文件最灵活的工具。您可以选择简单的表达式:

    perl -n -e '/^\D*([^:]+):/ and print "$1\n"' src.log
    

    或使匹配尽可能严格:

    perl -n -e '/^\D*((?:\d{1,3}\.){3}\d{1,3}):/ and print "$1\n"' src.log
    

    【讨论】:

      【解决方案3】:

      使用 sed

      sed -r 's/^ *[|] *([0-9]+[.][0-9]+[.][0-9]+[.][0-9]+):[0-9]{3}.*/\1/
      

      【讨论】:

        猜你喜欢
        • 2018-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-28
        • 1970-01-01
        • 2023-03-14
        相关资源
        最近更新 更多