awk를 사용하여 파일의 문자열 앞에 두 줄을 추가합니다.

awk를 사용하여 파일의 문자열 앞에 두 줄을 추가합니다.

두 줄을 추가하고 싶어요

allow = alaw
allow = g729

문자열 앞에

nat = no

파일 sip.conf(또는 텍스트 기반 파일)에서. 이전에 allow = alaw과 가 allow = g729이미 존재 했다면 nat = no추가해서는 안 됩니다. 이 스크립트는 매시간 실행됩니다. 그리고 이 줄은 파일 [general]바로 뒤와 두 섹션에 추가되어서는 안 됩니다 [providertrunk0].

파일 내용의 예:

[general]
disallow = all
allow = ulaw
nat = no

[providertrunk0]
disallow = all
allow = ulaw
;allow = alaw
nat = no

secret =
nat = no
progressinband = yes

allow = ulaw
allow = alaw
nat = no
progressinband = yes

disallow = all
allow = ulaw
allow = g729
nat = no
progressinband = yes

예상 출력

[general]
disallow = all
allow = ulaw
nat = no

[providertrunk0]
disallow = all
allow = ulaw
;allow = alaw
nat = no

secret =
allow = alaw
allow = g729
nat = no
progressinband = yes

allow = ulaw
allow = alaw
allow = g729
nat = no
progressinband = yes

disallow = all
allow = ulaw
allow = alaw
allow = g729
nat = no
progressinband = yes

내 시도

cat addCodec.awk

BEGIN {
    RS=""; ORS="\n\n"; FS=OFS="\n"
    skip["[general]"]
    skip["[providertrunk0]"]
    addCodec = "allow = alaw\nallow = g729"
    tgt = "nat = no"
}
!($1 in skip) {
    for (i=1; i<NF; i++) {
        if ( ($i != addCodec) && ($(i+1) == tgt) ) {
            $i = $i OFS addCodec
        }
    }
}
{ print }
awk -f addCodec.awk sip.conf

이 스크립트는 두 줄이 모두 존재하지 않는 경우에도 작동하며 이를 추가합니다. 단일 행이 있는 경우 멈췄습니다. 조건을 사용해야 하는 경우 어떻게 해야 합니까?

답변1

나는 전문가는 아니지만 awk(그러나 python) $i한 줄을 주어진 다음 두 줄이 있는 문자열과 비교합니다. "allow = alaw\nallow = g729"이것이 문제입니다. 각 줄을 개별적으로 확인해야 합니다.

$(i-1)$(i-2)(첫 번째)와 (두 번째)를 별도로 확인하고 비교하는 "allow = alaw"코드를 만들었습니다 "allow = g729". 이렇게 3가지 상황으로 나누어보겠습니다

FIRST - exist,  SECOND - missed
FIRST - missed, SECOND - missed
FIRST - missed, SECOND - exist

또는 에 대해 $i다른 값을 추가하십시오 .$(i-1)


BEGIN {
    RS=""; ORS="\n\n"; FS=OFS="\n"
    skip["[general]"]
    skip["[providertrunk0]"]
    addCodec1 = "allow = alaw"
    addCodec2 = "allow = g729"
    tgt = "nat = no"
}
!($1 in skip) {
    for (i=1; i<NF; i++) {
        if ($(i) == tgt) {
            # FIRST - exist, SECOND - missed
            if ( ($(i-1) == addCodec1) ) {
                $i = addCodec2 OFS $i
            }
            # FIRST - missed, SECOND - missed
            else if ( ($(i-1) != addCodec1) && ($(i-1) != addCodec2) ) {
                $i = addCodec1 OFS addCodec2 OFS $i 
            }
            # FIRST - missed, SECOND - exist
            else if ( ($(i-2) != addCodec1) && ($(i-1) == addCodec2)  ) {
                $(i-1) = addCodec1 OFS $(i-1)
            }
        }
    }
}
{ print }

그런데:덜 빠르고 간단하게 만들기 위해 다른 매개변수를 사용하여 두 번 실행하겠습니다.

첫 번째 것은 "allow = g729"앞에만 배치되고 "nat = no"두 번째는 "allow = alaw"앞에만 배치됩니다 "allow = g729".

"third line"이렇게 하면 이전 에 넣기 위해 다시 실행할 수 있고 이전에 "allow = alaw"넣기 위해 다시 실행할 수 있습니다 ."fourth line""third line"

답변2

기존 시도를 수정하세요. 다양한 가능한 시나리오를 보는 복잡성은 사용자 정의 함수 fx()에 캡슐화됩니다. 발견된 tgt 라인의 인덱스에 따라 다양한 시나리오가 그려집니다.

$ cat addCodec.txt
BEGIN {
    RS=""; ORS="\n\n"; FS=OFS="\n"
    skip["[general]"]
    skip["[providertrunk0]"]
    e1 = "allow = alaw"
    e2 = "allow = g729"
    a[e2] = a[e1] = 1
    addCodec = e1 OFS e2
    tgt = "nat = no"
}
!($1 in skip) {
    for (i=1; i<=NF; i++) {
        if ($i "" == tgt) {
          fx(i)
          break
        }
    }
}
{ print }
function fx(i,   cond) {
  cond = (i>2 ? (a[$(i-2)]+0) : 0) "" (i>1 ? (a[$(i-1)]+0) : 0)
  if      ( cond "" == "11" ) { $(i-2) = e1; $(i-1) = e2 }
  else if ( cond "" == "01" ) { $(i-1) = addCodec        }
  else if ( cond    ~  /0$/ ) { $(i) = addCodec OFS $(i) }
}

$ awk -f addCodec.txt file

관련 정보