awk + 줄이 파일에 정의되지 않은 경우에만 캡처된 단어 앞에 줄을 추가합니다.

awk + 줄이 파일에 정의되지 않은 경우에만 캡처된 단어 앞에 줄을 추가합니다.

다음 awk구문은 파일에서 "DatePattern"이라는 단어가 포함된 줄 앞에 3줄을 추가합니다.

$ awk 'done != 1 && /DatePattern/ {
    print "log4j.appender.DRFA=org.apache.log4j.RollingFileAppender"
    print "log4j.appender.DRFA.MaxBackupIndex=100"
    print "log4j.appender.DRFA.MaxFileSize=10MB"
    done = 1
    } 1' file >newfile && mv newfile file

문제는 행이 이미 존재하는지 여부는 상관하지 않는다는 것인데, 행이 아직 존재하지 않는 경우에만 삽입되도록 하려면 행 awk에 무엇을 추가해야 합니까 ?awk

다른 예

이 예에서는 "HOTEL"이라는 단어가 포함된 줄 앞에 "trump", "bush" 및 "putin"이라는 이름을 추가하려고 합니다. 단, 이러한 이름이 존재하지 않는 경우에만 해당됩니다.

$ awk 'done != 1 && /HOTEL/ {
    print "trump"
    print "bush"
    print "putin"
    done = 1
    } 1' file >newfile && mv newfile file

답변1

다음과 같이 이 작업을 수행할 수 있습니다.

# store the 3 lines to match in shell variables
line_1="log4j.appender.DRFA=org.apache.log4j.RollingFileAppender"
line_2="log4j.appender.DRFA.MaxBackupIndex=100"
line_3="log4j.appender.DRFA.MaxFileSize=10MB"

# function that escapes it's first argument to make it palatable
# for use in `sed` editor's `s///` command's left-hand side argument
esc() {
    printf '%s\n' "$1" | sed -e 's:[][\/.^$*]:\\&:g'
}

# escape the lines
line_1_esc=$(esc "$line_1")
line_2_esc=$(esc "$line_2")
line_3_esc=$(esc "$line_3")

# invoke `sed` and fill up the pattern space with 4 lines (rather than the default 1)
# then apply the regex to detect the presence of the lines 1/2/3.
sed -e '
    1N;2N;$!N
    '"/^$line_1_esc\n$line_2_esc\n$line_3_esc\n.*DatePattern/"'!D
    :a;n;$!ba
' input.file

답변2

이름의 순서는 중요하지 않으며 항상 3개의 그룹으로 나타난다는 가정하에 다음을 시도해 보세요.

awk '
BEGIN           {INSTXT = "trump" ORS "bush" ORS "putin"
                 for (n = split (INSTXT, T, ORS); n; n--) PRES[T[n]]
                }

!(LAST in PRES) &&
/HOTEL/         {print INSTXT
                }

                {LAST = $0
                }
1
' file

관련 정보