Bash 向后和向前解析文件
我有一个非常长的文件,具有周期性结构(三个点类似于不一定相等的行数,n只是一个索引): 我正在尝试制作一个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
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
您可以在一个工作hoAwk
命令中使用此功能
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