【问题标题】:Search for a (regex) match and then reformatting output in Linux搜索(正则表达式)匹配,然后在 Linux 中重新格式化输出
【发布时间】:2019-07-28 08:02:45
【问题描述】:

我的目标是搜索以给定字符串开头(或由给定字符串组成)的软件包,因为使用 Arch Linux 的命令 pacman 无法做到这一点。查找包最简单的方法是执行pacman -Sl |grep vivaldi,其中vivaldi 是包名,它将给出:

herecura vivaldi 2.3.1440.60-1 [installed]
herecura vivaldi-ffmpeg-codecs 71.0.3578.98-1 [installed]
herecura vivaldi-snapshot 2.4.1468.4-1

虽然很简单,但它有一个流程:它在任何地方搜索给定的包名,但包名总是在第一个空格和第二个空格之间。 很简单的解决方法是以下

pacman -Sl | grep -P "(?:[a-z0-9-]+) vivaldi"

控制台将显示类似于以下的输出:

herecura vivaldi 2.3.1440.60-1 [installed]
herecura vivaldi-ffmpeg-codecs 71.0.3578.98-1 [installed]
herecura vivaldi-snapshot 2.4.1468.4-1

它会给出(也许)与上述结果相同的正确结果。但还有一个警告:我想将输出重新排列为表单:

vivaldi 2.3.1440.60-1 [herecura] [installed] 
vivaldi-ffmpeg-codecs 71.0.3578.98-1 [herecura] [installed]
vivaldi-snapshot 2.4.1468.4-1 [herecura]

执行命令我已经很接近了:

pacman -Sl | grep -P "(?:[a-z0-9-]+) vivaldi" | awk '{print $2, $3, $4, $1}'

vivaldi 2.3.1440.60-1 [installed] herecura
vivaldi-ffmpeg-codecs 71.0.3578.98-1 [installed] herecura
vivaldi-snapshot 2.4.1468.4-1  herecura
vivaldi-snapshot-ffmpeg-codecs 72.0.3626.97-1  herecura

但是,这不是一个好方法,因为它使用grepawk,但仅awk 就足够了,因为它还支持正则表达式(例如see this blog post)。

这就是我所得到的。不幸的是,我无法将我编写的所有内容组合到一个命令中(我打算编写一个别名或函数)。

【问题讨论】:

    标签: regex shell awk command-line


    【解决方案1】:

    您能否尝试以下操作(如果我没记错的话),因为您提到的字符串将仅位于第 1 和第 2 个空格之间,因此成为行的第 2 个字段。现在,如果我们要检查第二个字段的值,我已经设置了第二个字段的条件来检查当前行的第二个字段是否为 vivaldi 然后进行打印。

    pacman -Sl | awk '$2~/vivaldi/{print $2, $3, $4, $1}'
    

    根据 OP 的评论,需要将 $1 包装在 [] 中,所以现在添加以下内容。

    pacman -Sl | awk '$2~/vivaldi/{print $2, $3, $4, "[" $1 "]"}'
    

    【讨论】:

    • 很好用!非常简单和优雅的解决方案。如何将 [] 添加到 $1 以形成 [herecura]?
    • 我不够清楚。我希望第一个参数 $1 被 [] 包围。我使用了pacman -Sl | awk '$2=="vivaldi"{print $2, $3, $4, "[",$1,"]"}',但它给了我vivaldi 2.3.1440.60-1 [installed] [ herecura ],它很接近,但在[] 之前有一个空格。
    • @menteith,因为,表示print要打印一个空格,所以不需要放置它以防你不需要它,简单:)
    • 我刚刚注意到您的命令只列出了一行,但pacman -Sl | grep vivaldi 提供了更多(这意味着有更多以 vivaldi 开头的包。AFAIK,这是因为它搜索给定的字符串(这里是vivaldi,但它应该搜索以名称vivaldi 开头的字符串)。
    • 太棒了!像魅力一样工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-14
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多