【问题标题】:Linux: How can i grep text from string to stringLinux:我如何从字符串到字符串 grep 文本
【发布时间】:2012-03-12 21:34:09
【问题描述】:

如何使用位于两个字符串之间的 grep 命令 txt 获取文本?

例如:

<--string 1-->
the text i need
<--string 2-->

两个标签之间的“我需要的文本”是动态的,因此我需要一个命令将文本从“”输出到“”

【问题讨论】:

  • “我需要的文字”是一行还是更多?

标签: linux bash grep


【解决方案1】:

这可能对你有用:

grep -A2 "<--string 1-->" file | grep -v "<--string 1-->\|<--string 2-->"

grep -A1 "<--string 1-->" file | grep -v "<--string 1-->"

或在单个进程中:

sed '/<--string 1-->/,/<--string 2-->/!d;//d' file

或:

awk '/<--string 2-->/{p=0};p;/<--string 1-->/{p=1}' file

【讨论】:

    【解决方案2】:

    假设“我需要的文本”只有一行,您应该检查 string1 和 string2 是否都出现(Alex 的解决方案只检查一件事)。

    更好的解决方案是:

    grep -A 2 "string 1" $file | tail -2 | grep -B 1 "string 2" | head -1
    

    【讨论】:

    • 你不能总是假设“我需要的文本”是一行
    【解决方案3】:

    如果您知道“我需要的文本”总是高于或低于字符串 1 或字符串 2,您可以使用 grep -A 1 "string 1" $file | tail -1grep -B 1 "string 2" $file | head -1

    【讨论】:

      【解决方案4】:

      我们需要知道 string1 和 string2 的行号是多少 我们可以使用 grep -n 然后使用 head 和 tail 我们可以得到 string1 和 string2 之间的线 例如:

      <--string 1-->
      the text i need
      <--string 2-->
      
      
      start=$(cat file | grep -n <--string 1--> | grep -Eo [0-9]+)
      finish=$cat file | grep -n <--string 2-->) | grep -Eo [0-9]+)
      res=$((finish-start))
      result=$(cat file | head -$start | tail -$res)
      

      这有点hacky,但它对我有用。

      【讨论】:

        【解决方案5】:

        希望对你有帮助。

        DATA=$(cat /tmp/file)
        STARTVAR=$(echo "$DATA" | grep -n '<--string 1-->' | grep -Eo [0-9]+)
        ENDVAR=$(echo "$DATA" | grep -n '<--string 2-->' | grep -Eo [0-9]+)
        CALC=$((($ENDVAR - $STARTVAR) - 1))
        result=$(echo "$DATA" | grep -A $CALC '<--string 1-->')
        echo "$result"
        

        如果您想在输出中包含'&lt;--string 2--&gt;',请将CALC=$((($ENDVAR - $STARTVAR) - 1)) 行替换为CALC=$(($ENDVAR - $STARTVAR))

        【讨论】:

          【解决方案6】:

          您可以为此使用 awk。

          包容性:

          awk '/<--string 1-->/,/<--string 2-->/' file
          

          不包括字符串1和2行:

          awk '/<--string 1-->/{flag=1; next} /<--string 2-->/{flag=0} flag' file
          

          这里,当在该行中找到''时设置一个标志,并在找到''时取消设置。

          您也可以使用以下方式保留第一行或第二行:

          awk '/<--string 1-->/{flag=1} /<--string 2-->/{flag=0} flag' file
          

          awk 'flag; /<--string 1-->/{flag=1} /<--string 2-->/{flag=0}' file
          

          【讨论】:

            【解决方案7】:
            grep word filename
            

            在 wiki 上检查 grep..http://en.wikipedia.org/wiki/Grep

            【讨论】:

            • 两个字符串之间的文本是动态的!