在命令行上清理IP输出



我有一个输出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

使用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

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

但是,不可能用正则表达式组捕获子字符串。

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

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

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

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

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

或者使匹配严格到你喜欢的程度:

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

using

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

最新更新