从文本文件中删除特定字符串以进行比较/比较

从文本文件中删除特定字符串以进行比较/比较

我正在尝试比较两个文本文件,但我需要先编辑它们以忽略某些字符串。以下是一个文本文件的示例:

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. 忽略/保留所有以Processingand开头的行
  2. ora识别包含或的所有行asm并删除它们之前的所有字符串。

我已经尝试过awkandsed但我似乎无法找到适合我的特定场景的正确代码组合。

答案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*$' "$@"; }

假设 GNUgrep或兼容构建有类似 perl 的正则表达式支持。

然后假设 shell 具有进程替换或进程重定向支持:

  • ksh//zshbash
    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 来比较这两个文件。效果非常好!

相关内容