Bash
在一個命令輸出中將多個 grep 儲存到一個變數
我正在嘗試獲取已啟動的 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 地址)。