【问题标题】:Linux shell script: How to match substring with regexLinux shell 脚本:如何将子字符串与正则表达式匹配
【发布时间】:2013-11-28 08:10:59
【问题描述】:

如何获取所有具有“client_type=0”的“clid”?管道字符“|”分隔每个客户信息。我的文字只有一行:

clid=2 cid=3346 client_database_id=5153 client_nickname=xLukas\s\p\sLukas client_type=0|clid=3 cid=3346 client_database_id=1 client_nickname=powered\sby\sMirWayne.DE client_type=1|clid=4 cid=3346 client_database_id=9661 client_nickname=编号\sone client_type=0|clid=5 cid=3469 client_database_id=1 client_nickname=powered\sby\sMirWayne client_type=1|clid=6 cid=1716 client_database_id=1 客户端昵称=FG\sBot 客户端类型=1|clid=7 cid=3469 client_database_id=9661 client_nickname=号码\stwo client_type=0|clid=8 cid=1762 client_database_id=4351 客户昵称=pr0zkillz1x\pTobi 客户类型=0|clid=9 cid=1764 client_database_id=5160 client_nickname=xL1mited\s/\sMax client_type=0|clid=10 cid=1716 client_database_id=9704 客户昵称=Sebi 客户类型=0|clid=13 cid=3346 client_database_id=4336 client_nickname=checker284\s\p\sSebbo client_type=0|clid=19 cid=1762 client_database_id=9312 客户昵称=pr0skillz1x\pDanie 客户类型=0|clid=30 cid=3346 client_database_id=9697 client_nickname=TeamSpeakUser client_type=0|clid=33 cid=1716 client_database_id=1 client_nickname=serveradmin client_type=1

我需要所有的clid,它的client_type=0 在一个额外的行中。比如这样:

    clid=2
    clid=3
    clid=4
    clid=5
    ...

我当前的解决方案不起作用:

    cat clientlist.txt | grep -Eo "clid=[0-9]+[\d\D]*client_type=0" | grep -Eo "clid=[0-9]+"

有人可以帮忙吗?

【问题讨论】:

  • cat 将文件转换为 grep?你肯定是在开玩笑! grep ... clientlist.txt | ... 每次调用可节省大约十亿个 CPU 周期。
  • 什么更好?我会使用每个可行的解决方案,但目前我没有。
  • 最好避免无用的猫和无用的管道。你开车时不会踩刹车,对吗?

标签: regex linux shell substring


【解决方案1】:

管道字符“|”分隔每个客户信息。

利用这些信息,你可以说:

tr '|' '\n' < clientlist.txt | grep -Po 'clid=\d+(?=.*client_type=0)'

对于您的输入,它会导致:

clid=2
clid=4
clid=7
clid=8
clid=9
clid=10
clid=13
clid=19
clid=30

【讨论】:

    【解决方案2】:

    使用 sed:

    tr '|' '\n' < file | sed -n '/client_type=0/s/\(clid=[0-9]*\).*$/\1/p'
    clid=2
    clid=4
    clid=7
    clid=8
    clid=9
    clid=10
    clid=13
    clid=19
    clid=30
    

    【讨论】:

    • 关闭,但不完全——你需要处理分隔符,所以正确的版本是sed -n -e 's/|/\n/' -e '/client_type=0/s/\(clid=[0-9]*\).*$/\1/p'
    • @OliverMatthews:谢谢我更新了,我以为输入文件中的管道后有新行。
    • 看了你的帖子后,我开始使用grep的频率越来越高,你似乎已经放弃了!
    • np。出于好奇,为什么 tr 而不是 sed 的额外参数?
    • @devnull: 哈哈 :) 不是故意的。不知何故,我认为 sed 对此更好,但你的 grep 也很酷。
    猜你喜欢
    • 2022-01-17
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 2013-10-18
    相关资源
    最近更新 更多