修剪 grep 命令的输出

修剪 grep 命令的输出

我使用此命令来获取输出,但我想修剪输出以查看精简的最终结果

所需结果:

EsbDwMarkDownAdbSub "CleClient" "3.1"
EsbDwMarkDownAdbSub "Encrypter" "1.0"

命令:

grep --color -H -r "__GLOBAL_SUBSTITUTION_VARIABLE__Environment/LibraryVersions" /opt/tibco/product/tra/domain/WFM-DEV 2>/dev/null

我当前看到的输出:

/opt/tibco/product/tra/domain/WFM-DEV/data/EsbDwMarkDownAdbSub.dat:       <instanceInfoPropertyname="__GLOBAL_SUBSTITUTION_VARIABLE__Environment/LibraryVersions/CleClient" value="3.1"/>
/opt/tibco/product/tra/domain/WFM-DEV/data/EsbDwMarkDownAdbSub.dat:    <instanceInfoProperty name="__GLOBAL_SUBSTITUTION_VARIABLE__Environment/LibraryVersions/Encrypter" value="1.0"/>

答案1

例如,您可以将结果导入sed(也许我们可以在知道您的实际输入的情况下为您提供更优雅的方式) - 将其添加到命令末尾grep

| sed -r 's#.*/(EsbDw[^\.]+).*/([^"]+").*=([^/]+)/>#\1 "\2 \3#'
EsbDwMarkDownAdbSub "CleClient" "3.1"
EsbDwMarkDownAdbSub "Encrypter" "1.0"
  • -r使用 ERE,这样我们就不必()逃避+
  • s#old#new#old用。。。来代替new
  • .*/之前的任何字符/
  • (EsbDw[^\.]+)EsbDw找到以a 开头和结尾的模式.,并保存在 a 之前的所有内容.
  • /([^"]+")/和之间的任何字符-包括"后保存所有内容/"
  • =([^/]+)/>保存介于=两者之间的一切/>
  • \1 "\2 \3三个已保存的模式之间有空格(并添加一个"

答案2

使用 Python2 可以相当轻松地实现所需的输出:

$ ./trim_lines.py < input.txt                                                                                            
EsbDwMarkDownAdbSub "CleClient" "3.1"
EsbDwMarkDownAdbSub "Encrypter" "1.0"

脚本内容trim_lines.py

#!/usr/bin/env python
import sys,os,re

for line in sys.stdin:
    words=line.strip().split()
    val1 = os.path.basename(words[0]).split(".")[0]
    val2 = '"' + os.path.basename(words[2])
    val3 = re.split("[=/]",words[-1])[1]
    print val1,val2,val3

这里发生的事情相当简单。我们使用<将输入文件的内容重定向到脚本(在您的例子中,来自 grep 的输入使用管道...| ./trim_lines.py将输出发送grep到脚本)。脚本循环遍历进入其 stdin 流的所有行,将每行拆分为单词,并使用一些内置模块(例如os.path和)额外过滤这些单词re。我们获得的前两个值使用os.path.basename(),最后一个值用于re.split()在多个分隔符处分解最后一个字符串。这里发生了很多事情,但相信我 - 它非常简单。

相关内容