显示匹配项(grep)并显示匹配行的一列

显示匹配项(grep)并显示匹配行的一列,grep,Grep,假设我有一个下面的文本文件(Nmap的.gnmap),我想要的是显示我的匹配和相应的IP地址。即,仅显示22/open和2000/open以及这两个端口的IP。我需要这个结果: 10.10.10.1 22/open 2000/open 10.10.10.2 2000/公开 获取IP很简单grep-iE“22/open | 2000/open”文件,但如何显示IP?我需要以下输出(确切的额外字符并不重要,只要每行包含IP和端口): 示例源文件: Host: 10.10.10.1 () Ports:

假设我有一个下面的文本文件(Nmap的.gnmap),我想要的是显示我的匹配和相应的IP地址。即,仅显示
22/open
2000/open
以及这两个端口的IP。我需要这个结果:

10.10.10.1 22/open 2000/open
10.10.10.2 2000/公开

获取IP很简单
grep-iE“22/open | 2000/open”文件
,但如何显示IP?我需要以下输出(确切的额外字符并不重要,只要每行包含IP和端口):

示例源文件:

Host: 10.10.10.1 () Ports: 22/open/tcp//ssh///, 80/open/tcp//http///, 113/closed/tcp//ident///, 443/open/tcp//https///, 541/open/tcp//uucp-rlogin///, 2000/open/tcp//cisco-sccp///  Ignored State: filtered (4994)
Host: 10.10.10.2 () Ports: 113/closed/tcp//ident///, 2000/open/tcp//cisco-sccp///   Ignored State: filtered (4998)

你能试试下面的吗

awk '
match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/){
  ip_found=substr($0,RSTART,RLENGTH)
}
{
  while(match($0,/22\/open|2000\/open/)){
    val=(val?val OFS:"")substr($0,RSTART,RLENGTH)
    $0=substr($0,RSTART+RLENGTH)
  }
  if(ip_found){
    print ip_found,val
  }
  ip_found=val=""
}
' Input_file
输出如下

10.10.10.1 22/open 2000/open
10.10.10.2 2000/open

谢谢你写下来。也许我天真地认为应该有某种1-liner,但我想不是这样。@Estanged,为什么需要
awk
是为了输出(从输入文件中选择几个部分),当然你可以在输出中使用sort,例如-->
awk code…|在这里排序
等,干杯。