如何清理masscan输出(-oL)

时间:2016-10-30 01:56:40

标签: bash awk sed output

我的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

4 个答案:

答案 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)

虽然汤姆的回答可能是这项工作中最好的答案,但有其他选择从来没有伤害。

使用awkcut

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