Bash

在一個命令輸出中將多個 grep 儲存到一個變數

  • May 11, 2018

我正在嘗試獲取已啟動的 IP 列表,因此用於nmap首先將所有 IP 保存在文本文件中:

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

您的腳本似乎沒有正確編寫:

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 地址)。

引用自:https://unix.stackexchange.com/questions/443260