터미널의 명령에서 결과 추출
다음 명령을 사용하여 nmap
스캔을 실행했습니다 .local network
nmap -sP 192.168.1.*
명령을 실행하면 다음과 비슷한 결과가 나타납니다.
Nmap scan report for macbook.att.net (192.168.1.21)
Host is up (0.019s latency).
MAC Address: 71:DF:4B:44:80:F1 (Apple)
Nmap scan report for lenovo.att.net (192.168.1.15)
Host is up (0.045s latency).
MAC Address: 21:EA:7D:84:08:A1 (Liteon Technology)
명령을 실행하고 다음 내용만 출력하려면 어떻게 해야 합니까?
1. Apple (192.168.1.21)
2. Liteon Technology (192.168.1.15)
내가 지금까지 시도한 것
지금까지 시도한 결과 grep
예상만큼 잘 작동하지 않습니다. nmap 스캔에서 결과를 얻고 "( )"와 IP 주소 사이에 있는 목록으로 구성하는 방법을 알아야 합니다.
답변1
아래와 같이 "awk" 명령을 사용해 볼 수 있습니다.
nmap -sP 192.168.1.* | awk -F"[)(]" '/^Nmap/{Nmap=$(NF-1); C+=1} /^MAC Address/{print C"."$(NF-1) "("Nmap")" }'
산출,
1. Apple (192.168.1.21)
2. Liteon Technology (192.168.1.15)
설명하다:
awk가 열리면 입력이 구분 기호 그룹에 의해 및/또는 지정된 대로 구분
-F
된다는 것을 "awk"에게 알립니다.(
)
-F"[)(]"
이것은
'/.../{...} /.../{...}'
awk의 스크립트 본문입니다. 귀하의 경우 첫 번째/^Nmap/{Nmap=$(NF-1); C+=1}
, 두 번째 부분 만 실행/^MAC Address/{print C"."$(NF-1) "("Nmap")" }
하거나 이 두 조건부 부분 중 하나도 실행하지 않습니다. 입력 문자열이나 행이 패턴으로 시작하는 경우에만 지정합니다(또는 처음에만 실행됩니다) 두 번째 부분)(^
즉, 출발선 앵커 및 라인/레코드의 시작 부분을 가리킴). 일치하는 항목은 대괄호 안의 코드를 실행합니다.Nmap
MAC Address
{...}
첫 번째 부분은 무엇을 하고 있나요?
위에서 언급한 것처럼 일치하는 항목이 발견되면 두 번째 필드( NF
마지막 필드(또는 정의된 구분 기호에 따라 레코드에서 반환된 필드 수 및 해당 값 $NF
) 값을 가리키는)가 변수에 저장 됩니다 Nmap
. 카운터 플래그 출력의 ID 목록에 대한 최종 일치 수를 계산하는 데 사용하는 변수$(NF-1)
C+=1
두 번째 부분은 무엇을 하고 있나요?
위와 동일하지만 일치하는 항목이 발견되면 ^MAC Address
먼저 카운터 C
값이 인쇄되고 점이 인쇄되고 .
다음으로 일치하는 줄의 끝에서 두 번째 필드가 인쇄되고 마지막으로 괄호 안의 "Nmap" 값, 즉 IP가 인쇄됩니다. 이전 일치 라인의
답변2
xml
다음 출력 형식을 사용할 수 있습니다 .
nmap -n -sP -oX - 192.168.1.0/24 | xmlstarlet sel -t \
-m //host \
-v address/@vendor \
-o ' (' -v 'address[@addrtype="ipv4"]/@addr' -o ')' -n
답변3
사용하는 awk
것이 선호되는 방법입니다. 나쁘지 않은 라이너입니다. 하지만 또 다른 해결책을 보여드리자면:
#!/bin/bash
COUNTER=0
IP=
COMPANY=
nmap -sP 192.168.1.* | while read line
do
if [[ "$line" =~ ^Nmap ]]; then
IP=$(echo "$line" | sed -e "s/.*(\(.*\))/\1/")
fi
if [[ "$line" =~ ^MAC ]]; then
COMPANY=$(echo "$line" | sed -e "s/.*(\(.*\))/\1/")
COUNTER=$((COUNTER+1))
echo "${COUNTER}. ${COMPANY} (${IP})"
IP=
COMPANY=
fi
done
sed 명령 설명:
첫 번째 sed 명령은 형식의 줄에서 IP 주소를 추출합니다 Nmap scan report for macbook.att.net (192.168.1.21)
. sed 명령은 다소 간단한 정규식(IP를 추출하는지 확인하기 위해 앵커와 문자 클래스도 사용해야 함)과 그룹 캡처를 사용합니다. sed 명령의 첫 번째 부분( first 와 second 사이 /
)은 일치시킬 문자열입니다 .*(\(.*\))
. .*(
여는 괄호가 뒤에 오는 모든 항목(또는 없음) 과 일치합니다 . 다음은 임의 개수의 문자를 캡처하는 캡처 그룹입니다 \(.*\)
(프로덕션 환경에서는 IP 주소 형식과 일치하는 정규식으로 변경해야 함). 완전한 정규 표현식의 끝은 입니다 )
. sed 명령의 두 번째 부분(두 번째와 세 번째 부분 사이 /
)은 대체되는 정규 표현식의 부분입니다. 이 경우 \1
첫 번째 캡처링 그룹의 내용만 표시됩니다.
두 번째 sed 명령은 기본적으로 동일합니다. 즉, "끝 부분에 괄호 세트가 포함된 문자열을 일치시키고 전체 문자열을 괄호의 내용으로 바꿉니다."라는 의미입니다.
까다로운 점은 플래그 없이 확장 정규식을 사용할 때 리터럴이라는 점 (
입니다 )
. 괄호를 열고 닫습니다. 그룹화에 사용된다는 것을 나타내려면 \(
이스케이프 처리해야 합니다 .\)
마지막으로 -e
명령에서 사용하는 옵션입니다. 이 경우 sed 명령당 일치하는 스크립트/정규식은 하나만 있으므로 선택 사항입니다. 나는 항상 그것을 사용합니다.
추천 도서, 매뉴얼 페이지 regex(3)
( regex(7)
때때로 호출됨) re_format(7)
및 Jeffrey Friedl이 쓴 O'Reilly 책 "정규 표현식 마스터하기"를 참조하세요.