我的目的是搜索以给定字符串开头(或由给定字符串组成)的软件包,因为用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
但是,这不是一个好方法,因为它将grep
与awk
一起使用,但是awk
就足够了,因为它还支持正则表达式(例如see this blog post)。
这就是我所得到的。不幸的是,我无法将所有编写的内容合并到一个命令中(我打算编写一个别名或函数)。
答案 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 "]"}'