Warm tip: This article is reproduced from serverfault.com, please click

bash-awk如果不匹配,则打印“未知”,多个匹配项

(bash - awk if not matched print "unknown", multiple matches)

发布于 2020-11-29 20:08:10

我收到了nmap结果,并且尝试使用awk处理各种(主机启动或关闭)结果。

我正在传递一个IP地址,并且想获得以下信息:状态(打开或关闭),主机名,操作系统。
目标:我需要访问每个字段才能使用其值更新数据库。我也想以尽可能简单的方式实现这一点,也许有什么方法可以将字段保存在变量中,这样我就可以使用它,检查它是否为空等。

更多细节:

  1. 如果主机关闭,则host_name =“ unknown”,而OS =“ unknown”
  2. 如果Host up抓住host_name并在此处检查OS->两种可能性,则/ Running:/或/ OSguess /这两个都将为我们提供OS,但我们将拥有一个或另一个。

主机的预期输出为:

                     $ ip $ status $ host_name $ os
主机启动时:134.99.120.2 host_up HostName Linux
主机关闭时:134.99.120.2 host_down未知未知

我在这里想出了这条线:
sudo nmap -O -R -p 22 -oN -T4 134.99.120.2 | awk '/down/{print$5}/Nmap scan report/{print$5}/Running:/{print$2}/OS guess/{print$4}'
但这并没有提供对输出的任何控制。

nmap的原始输出:
主机启动时:

 
>在2020-11-29 14:58 EST开始启动Nmap 6.40(http://nmap.org)
> HostName的Nmap扫描报告(134.99.120.2)主机已启动(0.00067s
>延迟)。端口状态服务22 / tcp open ssh警告:OSScan
>结果可能不可靠,因为我们找不到至少1个空缺
>和1个关闭的端口设备类型:通用运行:Linux OS CPE:
> xx:/ o:xxx:xxxxxos:9.10操作系统详细信息:Linux网络距离:7跳操作系统
>执行检测。请在以下位置报告任何不正确的结果
> http://nmap.org/submit/。已完成Nmap:扫描了1个IP地址(1个主机已启动)
>在2.58秒内 

主机关闭时:

>在2020-11-29 15:00 EST开始启动Nmap 6.40(http://nmap.org)
>注意:主机似乎掉线了。如果是真的,但是阻止了我们的ping
>探针,尝试-Pn Nmap完成:在3.64中扫描了1个IP地址(最多0台主机)
>秒 
Questioner
dwt.bar
Viewed
0
markp-fuso 2020-11-30 06:46:50

注意看起来拉曼在“发布答案”按钮上有点快...

假设:

  • nmap 输出将始终像OP提供的两个示例之一
  • nmap输出将始终在相同的字段中具有HostnameOS名称(即,不必担心nmap由于数据长度的变化而在不同的单词处换行)
  • OPOS guess在其示例中显示awk,示例nmap数据显示OS details(以下答案基于OS details; OP可以根据其nmap调用实际返回的内容进行修改
  • nmap实际上,数据确实在>每行输出的第一列中包含一个(如OP样本输入中所示);这意味着OPawk字段引用可能需要相应地移动+/-(OP可以根据行是否以开头来调整答案-下方- >

输入样本(代替nmap在主机上运行):

$ cat nmap.up.dat
> Starting Nmap 6.40 ( http://nmap.org ) at 2020-11-29 14:58 EST
> Nmap scan report for HostName (134.99.120.2) Host is up (0.00067s
> latency). PORT   STATE SERVICE 22/tcp open  ssh Warning: OSScan
> results may be unreliable because we could not find at least 1 open
> and 1 closed port Device type: general purpose Running: Linux OS CPE:
> xx:/o:xxx:xxxxxos:9.10 OS details: Linux Network Distance: 7 hops OS
> detection performed. Please report any incorrect results at
> http://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned
> in 2.58 seconds

$ cat nmap.down.dat
> Starting Nmap 6.40 ( http://nmap.org ) at 2020-11-29 15:00 EST
> Note: Host seems down. If it is really up, but blocking our ping
> probes, try -Pn Nmap done: 1 IP address (0 hosts up) scanned in 3.64
> seconds

一个awk解决方案,尽管我假设OP实际上不会nmap为单个IP地址(???)提供2套输出...

ipaddr='134.99.120.2'

awk -v ip="${ipaddr}" '                                # pass ip addr in as awk variable "ip"
FNR==1            { hstat="host_up"                    # reset defaults for status ...
                    hname=hos="unknown"                # hostname and host OS
                  }
/down/            { hstat="host_down" ; next }         # reset status
/scan report for/ { hname=$6          ; next }         # reset hostname
/OS details/      { hos=$5            ; next }         # reset host OS

ENDFILE           { fmt="%-18s%-12s%-15s%s\n"          # re-usable format
                    if ( NR==FNR )                     # for first file print a header:
                       { printf fmt, "$ip", "$status", "$host_name", "$os" }

                    printf fmt, ip, hstat, hname, hos  # otherwise print results
                  }
' nmap.up.dat nmap.down.dat

注意ENDFILE要求GNU awk(根据Ed Morton的评论)

上面生成:

$ip               $status     $host_name     $os
134.99.120.2      host_up     HostName       Linux
134.99.120.2      host_down   unknown        unknown