在命令行上清理IP输出

时间:2016-10-30 04:24:19

标签: bash awk sed output

输出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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

AWK非常适合您希望通过" columns"拆分文件的情况,并且您确切知道值/列的顺序是不变的。 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

答案 2 :(得分:1)

使用sed

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app"></div>