向后和向前解析文件

时间:2017-03-31 10:21:44

标签: bash parsing sed grep

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

...
string bar text1 (n-2)
...
string bar text1 (n-1)
...
string bar text1 (n)
...
STRING FOO
elements1
elements1
...
string bar text2 (n-2)
...
string bar text2 (n-1)
...
string bar text2 (n)
...
STRING FOO
elements2
elements2
...

我正在尝试制作一个bash脚本来解析这个文件,并在其他文件中打印以下信息:查找STRING FOO的所有外观并打印到新文件elements(可以例如,两个加上string bar 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只是一个"猜测"我需要回去多少行。除了低效之外,这些命令无法正常工作。我真的很感激别人的帮助。

3 个答案:

答案 0 :(得分:2)

您可以在一个 gung-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)

答案 1 :(得分:1)

$ sed -n '/string bar/h;/STRING FOO/{N;N;x;H;g;p}' in.txt

输出:

STRING FOO
elements1
elements1
string bar text1 (n)
STRING FOO
elements2
elements2
string bar text2 (n)
  1. sed flag -n表示“默认情况下不打印输出。可以通过命令p进行打印。
  2. /string bar/h - 当找到字符串“string bar”时,将(命令h)保留在保持缓冲区中。
  3. /STRING FOO/{ .. } - 当找到字符串“STRING FOO”时,在括号内执行命令。
  4. N;N - 将下一行(命令N)两行添加到当前一行(即“STRING FOO”+两行“元素”)。
  5. x - 交换保持和模式缓冲区。现在保持缓冲区3行“STRING FOO”和两个“元素”。 并在当前模式缓冲区“字符串栏”。
  6. H - 追加当前行以保留缓冲区。
  7. g - 从保持缓冲区获取字符串到当前模式空间。
  8. p - 从当前模式空间打印行。

答案 2 :(得分:1)

使用:

grep "STRING FOO\|string bar" file.out | grep -B 1 STRING FOO | head -n 1 

您将获得"string bar text1 (n)"

为你的&#34;元素&#34;重复相同的逻辑。

此致。