bash 스크립트가 변수에서 처음 n 줄과 마지막 n 줄을 삭제하도록 하려면 어떻게 해야 합니까?

bash 스크립트가 변수에서 처음 n 줄과 마지막 n 줄을 삭제하도록 하려면 어떻게 해야 합니까?

저는 "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.

관련 정보