我的masscan实用程序使用-oL选项生成的输出有问题(“grep-able”输出);例如,它输出:
Host: 143.137.155.7 () Ports: 80/open/tcp////
Host: 177.105.21.41 () Ports: 8080/open/tcp////
Host: 187.78.236.98 () Ports: 80/open/tcp////
Host: 177.137.76.220 () Ports: 8080/open/tcp////
Host: 177.105.10.112 () Ports: 9000/open/tcp////
Host: 191.232.34.9 () Ports: 80/open/tcp////
Host: 179.55.65.144 () Ports: 80/open/tcp////
Host: 177.83.203.147 () Ports: 8080/open/tcp////
Host: 177.182.50.124 () Ports: 8000/open/tcp////
上述内容既不易读也不易理解。
如何使用Linux命令行实用程序,例如sed,awk或grep,使用上面的文件输出如下内容?
143.137.155.7:80
177.105.21.41:8080
187.78.236.98:80
177.137.76.220:8080
177.105.10.112:9000
答案 0 :(得分:1)
怎么样
sed 's/^Host: \([0-9.]*\).*Ports: \([0-9]*\).*$/\1:\2/g'
说明:
s/regex/replacement/
用regex
replacement
^
匹配字符串的开头Host:
匹配自己[0-9.]
是一个与数字0到9和.
[0-9.]*
匹配零个或多个数字/点\([0-9.]*\)
将匹配的IP地址替换为\1
.
匹配任何单个字符.*
匹配零个或多个单个字符(即任何字符串)Ports:
匹配自己\([0-9]*\)
匹配一串数字,并将其显示为\2
.*$
匹配字符串的其余部分最后的标记g
将替换应用于所有匹配,而不是每行的第一个匹配。在这种情况下,只能有一个匹配(整行),因此标志不做任何事情。我是出于习惯而打字的。
答案 1 :(得分:1)
虽然汤姆的回答可能是这项工作中最好的答案,但有其他选择从来没有伤害。
使用awk
和cut
:
awk 'OFS=":" {print $2,$5}' | cut -d/ -f-1
在awk
中几乎可以肯定有一种更有效的方法可以做到这一点,但我不确定究竟是多少。
答案 2 :(得分:1)
awk可以将正则表达式作为分隔符。在/或1+空格上拆分,然后打印列。
awk -F '[/ ]+' '{print $2 ":" $5}'
答案 3 :(得分:0)
awk -F'[ /]' '{print $2":"$(NF-6)}/9000/{exit}' file
143.137.155.7:80
177.105.21.41:8080
187.78.236.98:80
177.137.76.220:8080
177.105.10.112:9000