【问题标题】:grepping a list of URLS for a keyword in domain portion为域部分中的关键字查找 URL 列表
【发布时间】:2024-01-22 10:49:01
【问题描述】:

我在一个文件(每行一个)中有一个很大的 URL 列表(数百万),如下所示:

http://someDomain.com/articlex=123&b=23

http://KEYWORDindomain.net/blahblah 

http://anotherKEYWORDindomain.org/blahblah/blip/q=123 

http://blabkkk.org/KEYWORD/blip/q=123

 (etc)

我想打印出某个关键字出现在网址的域部分的所有网址。

例如

grep <regex>KEYWORD<regex> file

output
======
http://KEYWORDindomain.net/blahblah
http://anotherKEYWORDindomain.org/blahblah/blip/q=123

我认为这应该很容易被 grep 支持,但在找出正则表达式时遇到了麻烦。也许我需要管道几个命令来达到我想要的结果?

我得到的最接近的是:grep "http://.*\?/"

谁有使用 shell 命令的好方法?

【问题讨论】:

    标签: regex linux grep


    【解决方案1】:

    试试

    \b(https?|ftp|file)://[^/\s]*KEYWORD[^/\s]*(?:/[-A-Z0-9+&@#/%?=~_|$!:,.;]*[A-Z0-9+&@#/%=~_|$])?
    

    这将匹配在第一个斜杠之前的部分中包含 KEYWORD 的 URL(如果有的话)。

    【讨论】:

    • 感谢提示,无法让它工作,这是我尝试过的,但我得到的错误是:mike@mike-desktop:~$ grep "\b(https?|ftp|file) ://[^/\s]*假期[^/\s]*(?:/[-A-Z0-9+&@#/%?=~_|$!:,.;]*[A -Z0-9+&@#/%=~_|$])?" urls.txt bash: ,: 无法识别的历史修饰符 mike@mike-desktop:~$ egrep \b(https?|ftp|file)://[^/\s]*vacation[^/\s]*(?: /[-A-Z0-9+&@#/%?=~_|$!:,.;]*[A-Z0-9+&@#/%=~_|$])? urls.txt bash: ,: 无法识别的历史修饰符
    • 尝试grep--perl-regexp 选项。另外,我不确定您是否需要将反斜杠加倍来转义它们。
    【解决方案2】:

    最简单的限定表达式是这样的(您相信其中包含 http:// 的任何内容都是 URL 的开头,这可能并不总是正确的,但是...):

    grep 'http://[^/]*KEYWORD'
    

    如果你想使用更多的 URL 前缀,试试这个:

    grep '\<[a-z]*://[^/]*KEYWORD'
    

    [^/]* 是键,表示“除 / 之外的任何字符,零出现或任意次数”。

    如果您知道需要排序的文件每行列出一个 URL,并且该 URL 从行首开始,那么您可以保护自己在一个不太可能但可能是虚假的 http:// 中间符合以下内容:

    grep '^http://[^/]*KEYWORD'
    

    就像 Tim 建议的那样,如果您有理由认为您的 URL 列表可能包含空格(我更喜欢列出空格和制表符的旧方法),您也可以始终保留空格:

    grep '^http://[^/ \t]*KEYWORD'
    

    希望这会有所帮助。

    【讨论】:

      最近更新 更多