检索两个模式之间的结果加上sed中的一行

时间:2018-01-24 15:54:28

标签: sed

我想在INFO:root:id is之后提取INFO:root:newId和一行之间的所有行。

有人可以建议我如何实现这个目标吗?

目前我正在使用

sed -n '/INFO:root:id is/,/INFO:root:newId/p' 1/python.log

我想弄清楚如何在第二次模式匹配后打印一行。

INFO:root:id is
INFO:root:16836211
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): abc.hh.com
DEBUG:urllib3.connectionpool:https://abc.hh.com:443 "POST /api/v2/import/row.json HTTP/1.1" 201 4310
INFO:root:newId
INFO:root:35047536
INFO:root:id is
INFO:root:46836211
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): abc.hh.com
DEBUG:urllib3.connectionpool:https://abc.hh.com:443 "POST /api/v2/import/row.json HTTP/1.1" 201 4310
INFO:root:newId
INFO:root:55547536

3 个答案:

答案 0 :(得分:0)

如果我正确理解问题

$ seq 10 | sed -n '/3/,/5/{/5/N;p;}'
3
4
5
6
  • /3/正在启动正则表达式,/5/正在结束正则表达式
  • /5/N获取结束正则表达式的额外行
  • GNU sed上测试,其他版本的语法可能会有所不同


使用awk

$ seq 10 | awk '/3/{f=1} f; /5/{f=0; if((getline a)>0) print a}'
3
4
5
6

答案 1 :(得分:0)

不清楚是否只需要匹配后的第一组线或所有匹配。

如果你想在匹配的模式之间设置第一个,那么你也可以使用head -n -1来结束匹配,然后使用$ sed -n '/INFO:root:id is/,/INFO:root:id/p' test.txt | head -n -1 INFO:root:id is INFO:root:16836211 DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): abc.hh.com DEBUG:urllib3.connectionpool:https://abc.hh.com:443 "POST /api/v2/import/row.json HTTP/1.1" 201 4310 INFO:root:newId INFO:root:35047536 打印除最后一行之外的所有内容。

<form method="post" enctype="multipart/form-data" action="{baseurl}/upload/screenshot">
                    <input type="hidden" name="serverid" value="{id}" />
                    <label>Carica uno Screenshot</label>
                    <br />
                    <label class="custom-file" id="customFile" for="screenshot">
                        <input type="file" class="custom-file-input" id="screenshot" name="screenshot" aria-describedby="fileHelp">
                        <span class="custom-file-control form-control-file"></span>
                    </label>
                    <br />
                    <button type="submit" class="btn btn-secondary">Carica file</button>
                </form>

答案 2 :(得分:0)

只需使用标志来指示何时找到开始和结束的正则表达式并相应地打印:

$ seq 10 | awk 'e{print buf $0; buf=""; b=e=0} /3/{b=1} b{buf = buf $0 ORS; if (/5/) e=1}'
3
4
5
6

请注意,当仅存在开始或结束正则表达式而不是两者时,这不存在打印行的潜在问题。其他答案,包括您当前接受的答案,都存在这个问题:

$ seq 10 | sed -n '/3/,/27/{/27/N;p;}'
3
4
5
6
7
8
9
10

$ seq 10 | awk '/3/{f=1} f; /27/{f=0; if((getline a)>0) print a}'
3
4
5
6
7
8
9
10

$ seq 10 | awk 'e{print buf $0; buf=""; b=e=0} /3/{b=1} b{buf = buf $0 ORS; if (/27/) e=1}'
$

请注意,我正确发布的脚本没有打印任何内容,因为输入中不存在以3开头且以27结尾的文本块。