터미널의 명령에서 결과 추출

터미널의 명령에서 결과 추출

터미널의 명령에서 결과 추출

다음 명령을 사용하여 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")" }하거나 이 두 조건부 부분 중 하나도 실행하지 않습니다. 입력 문자열이나 행이 패턴으로 시작하는 경우에만 지정합니다(또는 처음에만 실행됩니다) 두 번째 부분)( ^즉, 출발선 앵커 및 라인/레코드의 시작 부분을 가리킴). 일치하는 항목은 대괄호 안의 코드를 실행합니다.NmapMAC 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 책 "정규 표현식 마스터하기"를 참조하세요.

관련 정보