【问题标题】:remove text from left and right and keep string in middle从左右删除文本并将字符串保留在中间
【发布时间】:2017-10-20 09:10:10
【问题描述】:

有没有办法在linux中修改这个字符串

<host endtime="1495011823"><address addr="185.127.7.58" addrtype="ipv4"/><ports><port protocol="tcp" portid="3389"><state state="open" reason="syn-ack" reason_ttl="115"/></port></ports></host>
<host endtime="1495011823"><address addr="188.128.124.114" addrtype="ipv4"/><ports><port protocol="tcp" portid="3389"><state state="open" reason="syn-ack" reason_ttl="46"/></port></ports></host>
<host endtime="1495011823"><address addr="163.191.210.41" addrtype="ipv4"/><ports><port protocol="tcp" portid="3389"><state state="open" reason="syn-ack" reason_ttl="236"/></port></ports></host>
<host endtime="1495011823"><address addr="97.78.205.11" addrtype="ipv4"/><ports><port protocol="tcp" portid="445"><state state="open" reason="syn-ack" reason_ttl="45"/></port></ports></host>
<host endtime="1495011823"><address addr="93.103.218.96" addrtype="ipv4"/><ports><port protocol="tcp" portid="3389"><state state="open" reason="syn-ack" reason_ttl="112"/></port></ports></host>
<host endtime="1495011823"><address addr="75.106.77.247" addrtype="ipv4"/><ports><port protocol="tcp" portid="3389"><state state="open" reason="syn-ack" reason_ttl="237"/></port></ports></host>
<host endtime="1495011823"><address addr="5.200.35.35" addrtype="ipv4"/><ports><port protocol="tcp" portid="3389"><state state="open" reason="syn-ack" reason_ttl="120"/></port></ports></host>
<host endtime="1495011823"><address addr="147.196.146.236" addrtype="ipv4"/><ports><port protocol="tcp" portid="3389"><state state="open" reason="syn-ack" reason_ttl="55"/></port></ports></host>
<host endtime="1495011823"><address addr="89.21.189.7" addrtype="ipv4"/><ports><port protocol="tcp" portid="3389"><state state="open" reason="syn-ack" reason_ttl="53"/></port></ports></host>
<host endtime="1495011823"><address addr="78.139.51.5" addrtype="ipv4"/><ports><port protocol="tcp" portid="3389"><state state="open" reason="syn-ack" reason_ttl="108"/></port></ports></host>
<host endtime="1495011823"><address addr="62.193.141.140" addrtype="ipv4"/><ports><port protocol="tcp" portid="3389"><state state="open" reason="syn-ack" reason_ttl="107"/></port></ports></host>
<host endtime="1495011823"><address addr="136.227.47.165" addrtype="ipv4"/><ports><port protocol="tcp" portid="445"><state state="open" reason="syn-ack" reason_ttl="217"/></port></ports></host>
<host endtime="1495011823"><address addr="109.177.46.82" addrtype="ipv4"/><ports><port protocol="tcp" portid="445"><state state="open" reason="syn-ack" reason_ttl="50"/></port></ports></host>
<host endtime="1495011823"><address addr="89.116.124.135" addrtype="ipv4"/><ports><port protocol="tcp" portid="3389"><state state="open" reason="syn-ack" reason_ttl="110"/></port></ports></host>
<host endtime="1495011823"><address addr="88.245.53.232" addrtype="ipv4"/><ports><port protocol="tcp" portid="3389"><state state="open" reason="syn-ack" reason_ttl="112"/></port></ports></host>
<host endtime="1495011823"><address addr="101.55.37.147" addrtype="ipv4"/><ports><port protocol="tcp" portid="3389"><state state="open" reason="syn-ack" reason_ttl="108"/></port></ports></host>
<host endtime="1495011823"><address addr="206.201.204.229" addrtype="ipv4"/><ports><port protocol="tcp" portid="445"><state state="open" reason="syn-ack" reason_ttl="218"/></port></ports></host>
<host endtime="1495011823"><address addr="120.24.86.220" addrtype="ipv4"/><ports><port protocol="tcp" portid="3389"><state state="open" reason="syn-ack" reason_ttl="102"/></port></ports></host>
<host endtime="1495011823"><address addr="120.42.185.100" addrtype="ipv4"/><ports><port protocol="tcp" portid="3389"><state state="open" reason="syn-ack" reason_ttl="43"/></port></ports></host>
<host endtime="1495011823"><address addr="115.47.49.146" addrtype="ipv4"/><ports><port protocol="tcp" portid="3389"><state state="open" reason="syn-ack" reason_ttl="102"/></port></ports></host>

我需要从左边删除这个:

<host endtime="1495011823"><address addr="

这部分从右边开始:

" addrtype="ipv4"/><ports><port protocol="tcp" portid="3389"><state state="open" reason="syn-ack" reason_ttl="115"/></port></ports></host>

image

只保留中间的 ip 我如何在 linux 中使用 sed 命令来做到这一点??

【问题讨论】:

  • 使用 XML/HTML 解析器 (xmlstarlet, xmllint ...) 从节点地址中提取属性 addr 的值。

标签: linux string ubuntu sed terminal


【解决方案1】:
sed 's/^.*addr="\([^"]*\).*$/\1/' file

echo $line |sed 's/^.*addr="\([^"]*\).*$/\1/'

【讨论】:

    【解决方案2】:

    您可以使用 grep 仅过滤掉 IP 地址中的四个点分隔的数字块:

    grep -o -P "([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})"
    

    【讨论】:

    • grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' file
    【解决方案3】:

    你可以直接grepaddr属性值:

    grep -Po 'addr="\K[^"]*' file
    

    输出:

    185.127.7.58
    188.128.124.114
    163.191.210.41
    97.78.205.11
    93.103.218.96
    75.106.77.247
    5.200.35.35
    147.196.146.236
    89.21.189.7
    78.139.51.5
    62.193.141.140
    136.227.47.165
    109.177.46.82
    89.116.124.135
    88.245.53.232
    101.55.37.147
    206.201.204.229
    120.24.86.220
    120.42.185.100
    115.47.49.146
    

    【讨论】:

    • 感谢您的帮助,它正在工作....我需要知道是否有任何方法可以找到包含此字符串的行:portid="445">
    • @evilcode1,显示所需的输出,我会给出解决方案
    • ....... 这 2 行包含 diifrance portid 445 和 3389 ... 我需要删除所有包含 3389 字符串的行并保留包含 445 字符串的行
    • @evilcode1,现在,用新要求更新您的问题或创建新问题
    猜你喜欢
    • 1970-01-01
    • 2012-09-02
    • 2019-09-30
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多