搜索(正则表达式)匹配项,然后在Linux中重新格式化输出

时间:2019-03-06 15:34:06

标签: regex shell awk command-line

我的目的是搜索以给定字符串开头(或由给定字符串组成)的软件包,因为用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)。

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

1 个答案:

答案 0 :(得分: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 "]"}'