【问题标题】:grep to read exact data from text filegrep 从文本文件中读取准确数据
【发布时间】:2021-04-26 04:26:59
【问题描述】:

我有文件 test1.txt 文件,我正在尝试读取用双引号括起来并以连字符开头的变量,例如:“-color”。我试图使用这个 grep 命令 cat test1.txt | grep getParm | sed 's/getParm(/ /;s/&/ /;s/,/ /;s/"/ /g' | awk '{print $3}' ,我无法读取确切的数据对于文件中存在的所有变量。对于包含在 if...else 条件中的一些变量,我没有得到准确的数据。请帮助我阅读所需的数据。我已经发布了所需的数据有问题。

cat test1.txt | grep getParm

 if(!param.getParm(buf, "-logFile"))
   parameters()->getParm(&color, "-color");
   if (param.getParm(&species, "-species"))
   if (param.getParm(&width, "-width"))
   if (param.getParm(&xferLength, "-length"))
   else if (param.getParm(&xferLength, "-LargeTransferLength"))
   if (param.getParm(&cmdLineIoParms->pattern, "-pattern"))
      param.getParm(&cmdLineParams->volume,"-volume");

    cat test1.txt | grep getParm | sed 's/getParm(/  /;s/&/  /;s/,/  /;s/\"/  /g' |  awk  '{print  $3}'

    -logFile
    -color
    species
    width
    xferLength
    (param.
    cmdLineIoParms->pattern
    -volume

预期输出:-

-logFile
-color
-species
-width
-length
-LargeTransferLength
-pattern
-volume

【问题讨论】:

    标签: linux awk sed command-line grep


    【解决方案1】:

    使用 GNU grep、positiv lookbehind、非贪婪 * 和 positiv lookahead:

    ... | grep -oP '(?<=")-.*?(?=")'
    

    输出:

    -日志文件 -颜色 -物种 -宽度 -长度 -大传输长度 -图案 -体积

    见:The Stack Overflow Regular Expressions FAQ

    【讨论】:

      【解决方案2】:

      为了完善选择,您也可以使用sed,使用扩展的正则表达式,您可以这样做:

      sed -E '/getParm/s/^[^"]+"([^"]+).*$/\1/' file
      

      或使用 BRE,您将拥有:

      sed '/getParm/s/^[^"]*"\([^"][^"]*\).*$/\1/' file
      

      本质上,它定位包含getParm 的每一行,然后使用正常的替换形式将所有内容匹配到第一个'"',然后捕获直到下一个'"' 的内容,并重新插入作为第一个编号的反向引用捕获的内容\1.

      使用/输出示例

      使用file 中的示例数据,您将拥有:

      $ sed -E '/getParm/s/^[^"]+"([^"]+).*$/\1/' file
      -logFile
      -color
      -species
      -width
      -length
      -LargeTransferLength
      -pattern
      -volume
      

      【讨论】:

        【解决方案3】:

        使用您显示的示例/尝试,请您尝试一次。我们可以在单个 awk 本身中执行此操作。

        awk '/getParm/ && match($0,/"[^"]*/){print substr($0,RSTART+1,RLENGTH-1)}' Input_file
        

        简单的解释是,搜索字符串getParm 并使用match 函数匹配从" 直到第一次出现" 的所有内容,然后在此处打印匹配的正则表达式的子字符串,这是OP 显示的预期输出.

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-06-12
          • 1970-01-01
          • 1970-01-01
          • 2011-02-08
          • 1970-01-01
          • 2012-06-10
          • 2020-05-26
          相关资源
          最近更新 更多