저는 "dig ns google.com"을 수행하고 답변 섹션을 제외한 모든 결과를 잘라내는 스크립트를 만들고 있습니다.
지금까지 나는 다음을 가지고 있습니다 :
#!/bin/bash
echo -n "Please enter the domain: "
read d
echo "You entered: $d"
dr="$(dig ns $d)"
sr="$(sed -i 1,10d $dr)"
tr="$(head -n -6 $sr)"
echo "$tr"
이론적으로는 이것이 작동합니다. sed 및 head 명령은 스크립트 외부에서 개별적으로 작동하여 처음 10개와 마지막 6개 명령을 각각 잘라냅니다. 하지만 이를 스크립트에 넣으면 sed가 오류를 반환하고 변수를 입력 대신 명령으로 읽으려고 하는 것처럼 보입니다. . 오류는 다음과 같습니다
sed: invalid option -- '>'
지금까지 변수를 입력으로 읽는 방법을 찾지 못했습니다. "" 및 ""로 둘러싸려고 시도했지만 작동하지 않습니다. 분명히 나는 bash 스크립팅 전체에 대해 매우 새로운 것입니다. 어떤 도움이라도 좋을 것입니다!
답변1
sed
명령줄이 아닌 표준 입력에서 입력을 받으므로 스크립트가 이론적으로나 실제로 작동하지 않습니다. sed -i 1,10d $dr
당신이 생각하는 대로 되지 않습니다... sed
"$dr" 값을 처리할 파일 이름 목록으로 취급합니다.
echo "$dr" | sed -e '1,10d'
또는 을 시도하십시오 sed -e '1,10d' <<<"$dr"
.
그런데 당신은~ 해야 하다여기서는 큰따옴표를 사용하십시오 "$dr"
. 그렇지 않으면 로 구분된 여러 줄의 입력 이 아니라 한 줄의 입력만 sed
얻게 됩니다 .\n
sed
또는 더 나은 방법은 NS 레코드만 얻으려면 모든 명령을 다음 명령으로 바꾸면 됩니다.
tr=$(echo "$dr" | sed -n -e '/IN[[:space:]]\+NS[[:space:]]/p')
또는 모든 중간 단계를 제거하고 다음 명령을 실행합니다.
tr=$(dig ns "$d" | sed -n -e '/IN[[:space:]]\+NS[[:space:]]/p')
또는 다음을 통해 네임서버의 호스트 이름을 얻을 수 있습니다.
tr=$(dig ns "$d" | awk '/IN[[:space:]]+NS[[:space:]]/ {print $5}')
그건 그렇고, 의 출력은 host -t ns domain.example.com
의 출력보다 구문 분석하기가 더 쉬울 것입니다 dig
.