현재 네트워크의 일부 IP를 제공하는 작은 조각이 있습니다.
#!/bin/bash
read -p "network:" network
data=$(nmap -sP $network | awk '/is up/ {print up}; {gsub (/\(|\)/,""); up = $NF}')
다음과 같은 IP 주소를 반환합니다.
10.0.2.1
10.0.2.15
등.
이제 나는 그들이 다음과 같이 보이길 원합니다.
10.0.2.1, 10.0.2.15, ...
나는 bash 멍청한 놈입니다. 도와주세요 :)
답변1
구분 기호로 정확히 ","가 필요한 경우 다음을 사용할 수 있습니다.
echo "$data" | xargs | sed -e 's/ /, /g'
또는 쉼표를 구분 기호로 사용하면 충분합니다.
echo "$data" | paste -sd, -
답변2
너할 수 있다쉼표와 공백으로 구분된 IP 주소 목록을 반환하도록 스크립트를 수정하세요. awk
하지만 항목 목록을 특정 구분 기호로 연결하는 것은 일반적인 작업이므로 재사용 가능한 도구(스크립트, 함수, 컴파일된 도구) 프로그램을 사용하는 것이 좋습니다. , 어쨌든) 이렇게 하려고요.
여러 언어(예: perl
)에는 이러한 기능이 내장되어 있습니다. 불행하게도 bash는 그중 하나가 아니지만 작성하기는 매우 쉽습니다.
# perl-like join function for bash
join_by() {local d=$1; shift; printf '%s' "$1"; shift ; printf '%s' "${@/#/$d}"; echo;}
~/.bashrc
또는 에 넣어두면 ~/.bash_profile
항상 사용할 수 있습니다.
이는 Perl join()
함수를 모델로 했지만 표준 절차(연결된 파일의 행) join_by
와 충돌하지 않도록 이름이 지정되었습니다.join
첫 번째 매개변수는 구분 기호입니다. 나머지 모든 매개변수는 연결될 데이터입니다.
예를 들어:
$ data=$'10.0.2.1\n10.0.2.15'
$ join_by ', ' $data
10.0.2.1, 10.0.2.15
이 특별한 사용법은 권장되지 않습니다. 쉘 단어 분할에 의존합니다.인용되지 않음 $data
공백에 대한 변수(공백, 탭, 줄바꿈 등). 이것은 가능하다면 피해야 하는 것입니다. 출력을 nmap
단일 문자열 변수로 캡처하기 때문에 여기에 포함합니다 .
대신 배열을 사용해야 합니다. 이와 같이:
data=( $(nmap -sP "$network" | awk '/is up/ {print up}; {gsub (/\(|\)/,""); up = $NF}') )
이렇게 하면 파이프에서 반환된 각 IP 주소가 nmap | awk
배열의 별도 요소에 배치됩니다 $data
.
다음은 다음을 사용하여 배열을 연결하는 방법에 대한 인위적인 예입니다 join_by
.
$ data=(10.0.2.1 10.0.2.15)
$ join_by ', ' "${data[@]}"
10.0.2.1, 10.0.2.15