grep은 이전 명령문에서 발견된 문자열을 찾습니다.

grep은 이전 명령문에서 발견된 문자열을 찾습니다.

fortigate 구성 파일 내에서 주소 정의가 사용되는지 알아보려고 합니다.

구성 파일에서 주소가 포함된 섹션을 추출했습니다. 이 섹션의 행은 다음과 같습니다.

edit "address name"
    set associated-interface "someinterface"
    set subnet 1.1.1.1 0.0.0.0

이제 주소 이름을 사용하고 다음을 수행하여 규칙이나 주소 그룹이 이를 사용하는지 확인하고 싶습니다.

IFS='
'
for address in $(grep edit addresses.txt | cut -c10- | sed 's/"//'g); do echo $address; grep -n $address fortigate.conf; done

내가 가져온 IFS 섹션여기.

이것은 주소 정의 이름 목록을 반환하지만 grep 명령은 아무것도 찾지 못합니다. 적어도 자체적으로 찾아야 하기 때문에 이상합니다. 그렇죠?

답변1

IFS가 없으면 더 간단할 수 있습니다.

grep edit addresses.txt | cut -d\" -f2 | while read addr
do
echo "addr=[$addr]"
grep -n "$addr" fortigate.conf
done

답변2

당신의 cut명령은 너무 급진적입니다. 단독으로 실행하면 다음과 같은 효과를 볼 수 있습니다.

$ grep edit yyyy 
edit "address name"

$ grep edit yyyy |cut -c10-
ress name"

다음을 조정하세요 cut.

$ grep edit yyyy |cut -c6-
"address name"

답변3

주소 이름의 공백이 문제의 원인일 수 있습니다. 노력하다:

  IFS='
'
for address in $(grep edit addresses.txt | cut -c10- | sed 's/"//'g); do echo $address; grep -n "$address" fortigate.conf; done

참고: 주변에 따옴표가 있습니다.$주소grep할 때

관련 정보