Linux grep与特殊字符之间的打印
这就是我的数据的外观Linux grep与特殊字符之间的打印,linux,text,grep,Linux,Text,Grep,这就是我的数据的外观 ----------------------------------------------------------------------------------------------------------------------------------------------------------------- date start stop durat cond acc_5 acc_6 dialled_number o
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
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”的数据
所以我明白了
我知道我可以写“cat file.txt | grep 900012-A1-B1”,但有些行比上面1行多,下面1行少。那么,有没有一种方法可以告诉grep打印这些行,直到它在上面和下面碰到“----”,然后停止
我可以用python或bash简单地实现这一点。但是我正在寻找一个可以粘贴到bash中的单行代码,因为我会在数百个系统中使用它。并且不想将文件等复制粘贴到每个系统。这可能是使用
awk
的一种方法:
awk '/^--/ { if (f) {print line} {f=0; line=""; next}}
/900012/ {f=1}
{if (line) {line=line RS $0} else {line=$0}}' file
解释
在以/^-/{如果(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
$ 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