【问题标题】:Linux grep and print between special characterLinux grep 和特殊字符之间的打印
【发布时间】:2014-03-20 10:07:29
【问题描述】:

这就是我的数据的样子。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------
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,低于 1。那么有没有办法告诉grep打印行,直到它在上面和下面点击“-----”然后停止。

我可以在 python 或 bash 中简单地做到这一点。但是我正在寻找一个我可以粘贴到 bash 中的单行东西,因为我会在数百个系统中使用它。并且不想将文件等复制粘贴到每个系统中。

【问题讨论】:

    标签: linux text grep


    【解决方案1】:

    这可以是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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-12
      • 1970-01-01
      • 1970-01-01
      • 2014-07-27
      • 2014-08-13
      • 1970-01-01
      • 1970-01-01
      • 2017-09-02
      相关资源
      最近更新 更多