Bash 向后和向前解析文件

Bash 向后和向前解析文件,bash,parsing,sed,grep,Bash,Parsing,Sed,Grep,我有一个非常长的文件,具有周期性结构(三个点类似于不一定相等的行数,n只是一个索引): 我正在尝试制作一个bash脚本来解析此文件,并将以下信息打印到另一个文件中:查找STRING FOO的所有外观,并将元素(例如可以是两个)加上字符串条n打印到新文件中。为了实现这一点,我尝试了以下命令: grep -A 2 "STRING FOO" input_file.txt >> output_file.txt grep -B 200 "STRING FOO" input_file.tx

我有一个非常长的文件,具有周期性结构(三个点类似于不一定相等的行数,n只是一个索引):

我正在尝试制作一个bash脚本来解析此文件,并将以下信息打印到另一个文件中:查找
STRING FOO
的所有外观,并将
元素(例如可以是两个)加上
字符串条n
打印到新文件中。为了实现这一点,我尝试了以下命令:

grep -A 2 "STRING FOO"  input_file.txt   >> output_file.txt
grep -B 200 "STRING FOO" input_file.txt | tac | sed -n '/'string bar n'/ { p ; q }' >> output_file.txt
预期产出:

STRING FOO
elements1
elements1
string bar text1
STRING FOO
elements2
elements2
string bar text2

其中数字200只是我需要返回多少行的“猜测”。这些命令不仅效率低下,而且工作不正常。我真的很感激别人的帮助

您可以使用这个“一工多用”命令

awk '/string bar/{ pat=$0; }/\<STRING FOO\>/{c=NR+2}(NR<=c){print}(NR==c){print pat}' file

您可以在一个工作ho
Awk
命令中使用此功能

awk '/string bar/{ pat=$0; }/\<STRING FOO\>/{c=NR+2}(NR<=c){print}(NR==c){print pat}' file
输出:

STRING FOO
elements1
elements1
string bar text1 (n)
STRING FOO
elements2
elements2
string bar text2 (n)
  • sed标志
    -n
    表示“默认情况下不打印输出。打印可以通过命令
    p
    完成。”
  • /string bar/h
    -当找到字符串“string bar”时,将其保持在保持缓冲区中(命令
    h
  • /STRING FOO/{..}
    -当找到字符串“STRING FOO”时,在括号内执行命令
  • N;N
    -将下一步(命令
    N
    )两行追加到当前一行(即“字符串FOO”+两行“元素”)
  • x
    -交换保持和模式缓冲区。现在在保持缓冲区中,有3行带有“STRING FOO”,两行带有“elements”。 并在当前模式缓冲区“字符串栏”
  • H
    -追加当前行以保留缓冲区
  • g
    -从保持缓冲区到当前模式空间获取字符串
  • p
    -从当前图案空间打印行
  • 输出:

    STRING FOO
    elements1
    elements1
    string bar text1 (n)
    STRING FOO
    elements2
    elements2
    string bar text2 (n)
    
  • sed标志
    -n
    表示“默认情况下不打印输出”。可以通过命令
    p
    进行打印
  • /string bar/h
    -当找到字符串“string bar”时,将其保持在保持缓冲区中(命令
    h
  • /STRING FOO/{..}
    -当找到字符串“STRING FOO”时,在括号内执行命令
  • N;N
    -将下一步(命令
    N
    )两行追加到当前一行(即“字符串FOO”+两行“元素”)
  • x
    -交换保持和模式缓冲区。现在在hold buffer中,有3行带有“STRING FOO”,两行带有“elements”。 并在当前模式缓冲区“字符串栏”
  • H
    -追加当前行以保留缓冲区
  • g
    -从保持缓冲区到当前模式空间获取字符串
  • p
    -从当前图案空间打印行
  • 与:

    您将拥有
    “字符串条文本1(n)”

    对你的“元素”重复同样的逻辑

    真的

    带有:

    grep "STRING FOO\|string bar" file.out | grep -B 1 STRING FOO | head -n 1 
    
    您将拥有
    “字符串条文本1(n)”

    对你的“元素”重复同样的逻辑



    真的

    从OP的用法来看,似乎
    stringbar n
    不是整行,而是附加在从
    stringfoo
    开始的三行之后,类似于
    awk'/stringbar n/{s=$0}/stringfoo/{print$0;f=1;c=2;next}f&&c--;f&&c==0{print s;f=0}'文件
    @Sundeep:感谢您的尝试,将保留与他实际操作相符的OPrequirement@Sundeep:但我建议在您的示例中使用一个完整的字符串匹配,如我的回答:)我的理解是,如果该字符串是常量,OP就不必使用grep+tac+sedop的第二个命令,似乎
    stringbar n
    不是整行,而是附加在从
    stringfoo
    开始的三行之后,类似于
    awk'/stringbar n/{s=$0}/stringfoo/{print$0;f=1;c=2;next}f&&c--;f&&c==0{print s;f=0}'文件
    @Sundeep:感谢您的尝试,将保留与他实际操作相符的OPrequirement@Sundeep:但是我建议在你的例子中使用一个完整的字符串匹配,就像我的回答:)我的理解是,如果这个字符串是常量,OP就不必麻烦使用grep+tac+sed的第二个命令谢谢你的回答!它只能工作一次,而且文件的结构会定期重复一定次数,我想要所有这些内容。@Panadestein您可以通过修改输入以包含至少两个这样的结构,将预期输出显式添加到问题中来说明这一点。@Sundeep,您完全正确,不清楚。我希望现在是这样。@Panadestein,我确定答案非常感谢您的详细回答@komar它也有效!谢谢你的回答!它只能工作一次,而且文件的结构会定期重复一定次数,我想要所有这些内容。@Panadestein您可以通过修改输入以包含至少两个这样的结构,将预期输出显式添加到问题中来说明这一点。@Sundeep,您完全正确,不清楚。我希望现在是这样。@Panadestein,我确定答案非常感谢您的详细回答@komar它也有效!
    grep "STRING FOO\|string bar" file.out | grep -B 1 STRING FOO | head -n 1