这就是我的数据的外观。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
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中粘贴的单行内容,因为我会在数百个系统中使用它。并且不想将文件等粘贴到每个系统中。
答案 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