![비교/비교를 위해 텍스트 파일에서 특정 문자열을 제거합니다.](https://linux55.com/image/221402/%EB%B9%84%EA%B5%90%2F%EB%B9%84%EA%B5%90%EB%A5%BC%20%EC%9C%84%ED%95%B4%20%ED%85%8D%EC%8A%A4%ED%8A%B8%20%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C%20%ED%8A%B9%EC%A0%95%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84%20%EC%A0%9C%EA%B1%B0%ED%95%A9%EB%8B%88%EB%8B%A4..png)
두 개의 텍스트 파일을 비교하려고 하는데 특정 문자열을 무시하려면 먼저 편집해야 합니다. 다음은 텍스트 파일의 예입니다.
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
나는 두 가지를 달성하려고 노력하고 있다고 믿습니다.
Processing
및로 시작하는 모든 줄을 무시/유지ora
또는 를 포함하는 모든 줄을 식별asm
하고 그 앞에 있는 문자열을 제거합니다.
시도해 보았지만 awk
내 sed
특정 시나리오에 적합한 코드 조합을 찾을 수 없는 것 같습니다.
답변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과 유사한 정규식을 지원한다고 가정합니다.
그런 다음 쉘에 프로세스 대체 또는 프로세스 리디렉션 지원이 있다고 가정합니다.
ksh
zsh
//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를 사용하여 두 파일을 비교했습니다. 효과는 매우 좋습니다!