Linux grep和特殊字符之间的打印

时间:2014-03-20 10:07:29

标签: linux text grep

这就是我的数据的外观。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------
date        start     stop      durat  cond  acc_5  acc_6  dialled_number   outg_trunk  connected_num    inc_trunk   calling_num      charged_num      ring  que
60512-09-56  66:65:99  66:90:65  0081212  NI                  90000                        912690            0050060055  56012975125        56012975125        8     0
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
date        start     stop      durat  cond  acc_5  acc_6  dialled_number   outg_trunk  connected_num    inc_trunk   calling_num      charged_num      ring  que
60512-09-56  66:67:59  66:95:55  00955  I                   900012                        9120512            0700050005  901299120512        901299120512        0     0
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
date        start     stop      durat  cond  acc_5  acc_6  dialled_number   outg_trunk  connected_num    inc_trunk   calling_num      charged_num      ring  que
60512-09-56  66:67:60  66:95:55  009512  NJ                  90009            5000060069  05055                        9120512            912999            5     0

endpoint                endp_type     codec_5     codec_6     cum_pack_lost  pack_lost  frac_lost   mean_delay  worst_delay  mean_jitter  worst_jitter  R-value
50.9.0.56:57696         a_multiLim    PCMA                    0              0          0          0           65           0            0             996
-----------------------------------------------------------------------------------------------------  ------------------------------------------------------------

这只是数据的一个例子,它包含数千条这样的行。我想找到包含例如" 900012"

的数据

所以我得到了


date        start     stop      durat  cond  acc_5  acc_6  dialled_number   outg_trunk  connected_num    inc_trunk   calling_num      charged_num      ring  que
60512-09-56  66:65:99  66:90:65  0081212  NI                  90000                        912690            0050060055  56012975125        56012975125        8     0
-----------------------------------------------------------------------------------------------------------------------------------------------------------------

我知道我可以做" cat file.txt | grep 900012 -A1 -B1"但是有些线条比上面的线条多1个,下面的线条一个。那么有没有办法告诉grep打印行直到它击中" -----"上面和下面然后停止。

我可以简单地在python或bash中执行此操作。但我正在寻找一个可以在bash中粘贴的单行内容,因为我会在数百个系统中使用它。并且不想将文件等粘贴到每个系统中。

1 个答案:

答案 0 :(得分:0)

这可以是awk的一种方式:

awk '/^--/ { if (f) {print line} {f=0; line=""; next}}
     /900012/ {f=1}
     {if (line) {line=line RS $0} else {line=$0}}' file

解释

  • /^--/ { if (f) {print line} {f=0; line=""; next}}在以--开头的行中,检查是否设置了标记f。如果是,则打印缓冲的数据。然后它取消设置f,清空缓冲的行并跳转到下一行。
  • /900012/ {f=1}如果该行与900012匹配,则触发标记f
  • 在任何一行
  • {if (line) {line=line RS $0} else {line=$0}},缓冲变量line中的内容。

对于您的样本输入,它返回:

$ awk '/^--/ { if (f) {print line} {f=0; line=""; next}} /900012/ {f=1} {if (line) {line=line RS $0} else {line=$0}}' file
date        start     stop      durat  cond  acc_5  acc_6  dialled_number   outg_trunk  connected_num    inc_trunk   calling_num      charged_num      ring  que
60512-09-56  66:67:59  66:95:55  00955  I                   900012                        9120512            0700050005  901299120512        901299120512        0     0