将一个命令输出中的多个 grep 存储到一个变量

将一个命令输出中的多个 grep 存储到一个变量

我正在尝试获取已启动的 IP 列表,因此nmap首先将它们全部保存在文本文件中:

nmap -v -sn 10.10.10.1-254 -oG hosts.txt 

现在我想nmap在这些 IP 上运行另一个命令,以便从文本文件中解析并获取 IP。我正在尝试以下操作,但它不起作用;该变量v没有保存 IP 值:

#!/bin/bash
while read line; do    
    v=$line|grep 'Up' -B1|grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'

    echo $v
done < hosts.txt

答案1

您的脚本似乎没有正确编写:

v=$line | grep [...]

分配变量没有输出,因此您没有将任何内容传递到grep.

awk指向您的文件可能会更简单hosts.txt

$ nmap -v -sn 10.10.10.1/24 -oG hosts.txt > /dev/null 2>&1
$ awk '$NF=="Up" { print $2 }' hosts.txt    

给定创建的文件的格式nmap(请原谅不同的 IP 范围;我显然位于不同的网络上,但该示例仍然有效):

$ head hosts.txt
# Nmap 7.60 scan initiated Fri May 11 10:14:28 2018 as: nmap -v -sn -oG hosts.txt 172.28.9.67/24
# Ports scanned: TCP(0;) UDP(0;) SCTP(0;) PROTOCOLS(0;)
Host: 172.28.9.0 (hostname1.internal)   Status: Up
Host: 172.28.9.1 (hostname2.internal)   Status: Up

如果我们只对显示的主机感兴趣Status: Up,那么神奇的词就是线路上的最后一个。因此,我们通常awk只查看最后一个字段等于 的那些行Up,并打印第二个字段(即:IP 地址)。

相关内容