비교/비교를 위해 텍스트 파일에서 특정 문자열을 제거합니다.

비교/비교를 위해 텍스트 파일에서 특정 문자열을 제거합니다.

두 개의 텍스트 파일을 비교하려고 하는데 특정 문자열을 무시하려면 먼저 편집해야 합니다. 다음은 텍스트 파일의 예입니다.

Processing Server ABC-123
oracle   10785     1  0 May17 ?        00:00:21 asm_smon_+ASM
oracle   11151     1  0 May17 ?        00:00:15 ora_smon_CSEREF
oracle   11656     1  0 May17 ?        00:00:16 ora_smon_prblogp
Processing Server ABC-456
Processing Server ABC-789
oracle      5514       1  0 May20 ?        00:00:13 asm_smon_+ASM
oracle      5777       1  0 May20 ?        00:00:11 ora_smon_COGCV05

목표는 다음과 같이 만드는 것입니다.

Processing Server ABC-123
asm_smon_+ASM
ora_smon_CSEREF
ora_smon_prblogp
Processing Server ABC-456
Processing Server ABC-789
asm_smon_+ASM
ora_smon_COGCV05

나는 두 가지를 달성하려고 노력하고 있다고 믿습니다.

  1. Processing및로 시작하는 모든 줄을 무시/유지
  2. ora또는 를 포함하는 모든 줄을 식별 asm하고 그 앞에 있는 문자열을 제거합니다.

시도해 보았지만 awksed특정 시나리오에 적합한 코드 조합을 찾을 수 없는 것 같습니다.

답변1

이런 종류의 작업을 위해 나는 일반적으로 다음과 같이 입력을 변환하는 함수를 정의합니다.

transform() { awk '{print /^Processing/ ? $0 : $NF}' "$@"; }

또는:

transform() {
  awk '/^Processing/ {print; next}
       $NF ~ /^(ora|asm)/ {print $NF; next}' "$@"
}

또는:

transform() { grep -Po '^Processing.*|(?<!\S)(ora|asm)\S*$' "$@"; }

GNU grep또는 호환 빌드가 Perl과 유사한 정규식을 지원한다고 가정합니다.

그런 다음 쉘에 프로세스 대체 또는 프로세스 리디렉션 지원이 있다고 가정합니다.

  • kshzsh//bash
    diff -u <(transform<file1) <(transform<file2)
    
  • yash
    diff -u /dev/fd/3 3<(transform<file1) /dev/fd/4 4<(transform<file2)
    
  • rc또는 파생물(함수 정의 구문도 다르지만)
    diff -u <{transform<file1} <{transform<file2}
    
  • fish(함수 정의 구문도 다르지만)
    diff -u (transform<file1|psub) (transform<file2|psub)
    

답변2

awk를 사용하십시오.

$ awk '{print $(NF>3 ? NF : 0)}' file
Processing Server ABC-123
asm_smon_+ASM
ora_smon_CSEREF
ora_smon_prblogp
Processing Server ABC-456
Processing Server ABC-789
asm_smon_+ASM
ora_smon_COGCV05

관심 있는 부분만 비교하는 경우 비교하기 전에 파일을 편집할 필요가 없습니다. 예를 들어 두 입력 파일은 3행과 5행의 키 값이 다르고, 키가 아닌 값도 다릅니다. ​라인 5, 2, 8의 경우:

$ head file{1,2}
==> file1 <==
Processing Server ABC-123
oracle   10785     1  0 May17 ?        00:00:21 asm_smon_+ASM
oracle   11151     1  0 May17 ?        00:00:15 ora_smon_CSEREF
oracle   11656     1  0 May17 ?        00:00:16 ora_smon_prblogp
Processing Server ABC-456
Processing Server ABC-789
oracle      5514       1  0 May20 ?        00:00:13 asm_smon_+ASM
oracle      5777       1  0 May20 ?        00:00:11 ora_smon_COGCV05

==> file2 <==
Processing Server ABC-123
oracle   99999     1  0 May17 ?        00:00:21 asm_smon_+ASM
oracle   11151     1  0 May17 ?        00:00:15 here_we_go
oracle   11656     1  0 May17 ?        00:00:16 ora_smon_prblogp
Processing Server FOO-999
Processing Server ABC-789
oracle      5514       8  0 May20 ?        00:00:13 asm_smon_+ASM
oracle      5777       1  0 May20 ?        00:00:11 ora_smon_COGCV05

우리는 모든 차이점을 찾을 수 있습니다 diff:

$ diff file{1,2}
2,3c2,3
< oracle   10785     1  0 May17 ?        00:00:21 asm_smon_+ASM
< oracle   11151     1  0 May17 ?        00:00:15 ora_smon_CSEREF
---
> oracle   99999     1  0 May17 ?        00:00:21 asm_smon_+ASM
> oracle   11151     1  0 May17 ?        00:00:15 here_we_go
5c5
< Processing Server ABC-456
---
> Processing Server FOO-999
7c7
< oracle      5514       1  0 May20 ?        00:00:13 asm_smon_+ASM
---
> oracle      5514       8  0 May20 ?        00:00:13 asm_smon_+ASM

그러나 키 값만 변경되었음을 알 수 있습니다.

$ awk '
    { key=$(NF>3 ? NF : 0) }
    NR==FNR { a[NR]=key} a[FNR] != key{print FNR , "<", a[FNR] ORS FNR, ">", key }
' file{1,2}
3 < ora_smon_CSEREF
3 > here_we_go
5 < Processing Server ABC-456
5 > Processing Server FOO-999

필요에 따라 출력 형식을 조정합니다.

답변3

이건 어때:

serverTracking.log(테스트 목적으로 가짜 항목 참고)

Processing Server ABC-123
oracle   10785     1  0 May17 ?        00:00:21 asm_smon_+ASM
oracle   11151     1  0 May17 ?        00:00:15 ora_smon_CSEREF
oracle   22231     2  0 May17 ?        00:00:16 som_other_TYPE
oracle   11656     1  0 May17 ?        00:00:16 ora_smon_prblogp
Processing Server ABC-456
Processing Server ABC-789
oracle      5514       1  0 May20 ?        00:00:13 asm_smon_+ASM
oracle      5777       1  0 May20 ?        00:00:11 ora_smon_COGCV05
oracle      5674       1  0 May20 ?        00:00:14 som_other_type

SED 스크립트(Ubuntu bash 사용)

sed -E -n 's/(.* asm_.*)|(.* ora_.*)|(Processing Server.*)/\1\2\3/p' serverTracking.log | sed -E 's/(.*[0-9]*.:[0-9]*.:[0-9]*[[:blank:]]*)//' > serverTrackingFiltered.log

serverTrackingFiltered.log

Processing Server ABC-123
asm_smon_+ASM
ora_smon_CSEREF
ora_smon_prblogp
Processing Server ABC-456
Processing Server ABC-789
asm_smon_+ASM
ora_smon_COGCV05

답변4

도와주셔서 감사합니다! 귀하의 모든 제안은 서로 다른 방식으로 작동하지만 나에게 효과가 있었던 명령은 다음과 같습니다.

sed -E -n 's/(.* asm_.*)|(.* ora_.*)|(Processing Server.*)/\1\2\3/p' BEFORE_FILE.txt | sed -E 's/(.*[0-9]*.:[0-9]*.:[0-9]*[[:blank:]]*)//' > /FOLDER/BEFORE_OUTPUT.log
sed -E -n 's/(.* asm_.*)|(.* ora_.*)|(Processing Server.*)/\1\2\3/p' AFTER_FILE.txt | sed -E 's/(.*[0-9]*.:[0-9]*.:[0-9]*[[:blank:]]*)//' > /xFOLDER/AFTER_OUTPUT.log

그런 다음 MobaDiff를 사용하여 두 파일을 비교했습니다. 효과는 매우 좋습니다!

관련 정보