当我单独输入这些命令时,我得到了我想要的结果:
cat /var/log/apt/history.log | grep 'apt install' > installation.txt
grep -v "nvidia" installation.txt > tmpfile && mv tmpfile installation.txt
awk -F"ll " '{print $2}' installation.txt > temp1
sed -n '/--/!p' temp1 > temp2
sed -n '/-f/!p' temp2 > installation.txt
但我不知道如何结合这些......
这里是我在没有 nvidia 搜索的情况下进行的一些测试,试图首先了解哪里出了问题:
cat /var/log/apt/history.log | grep 'apt install' > file | awk -F"ll " '{print $2}' file > temp | sed -n '/--/!p' temp > file | sed -n '/-f/!p' file > installation.txt
cat /var/log/apt/history.log | grep 'apt install' > file | awk -F"ll " '{print $2}' file | awk -F"ll " '{print $2}' file | sed -n '/--/!p' file | sed -n '/-f/!p' file
cat /var/log/apt/history.log | grep 'apt install' > file | awk -F"ll " '{print $2}' file > temp | sed -n '/--/!p' temp > file | sed -n '/-f/!p' file > installation.txt
我如何组合这些操作?
我希望能够导出我已安装的软件包并将该功能包含在我制作的脚本中可以在 github 上找到。
我需要在我的中使用这个命令包.sh脚本。
答案1
到目前为止的答案都很好,并且解决了您想要做的事情。我的回答更多地针对您对 shell 命令的理解(或误解)。
您可以cat /var/log/apt/history.log | grep 'apt install' > file
读取cat
文件,将其传递到输出到grep
.你不需要cat
,grep
它本身就有能力读取文件。
> file | awk
其次,步骤中还有那件事grep
。我不确定那应该做什么。> file
方法 ”将输出定向到文件(而不是将其转储到终端上)“但是| awk
手段”捕获输出并发送到awk
“。我认为你不能同时执行这两项操作。(有一个tee
命令将其输入的副本发送到两个目的地,但这不是你在这里所做的)
答案2
所有内容组合成一个awk
命令,如下所示:
awk -F'll ' '
/apt install/ && !/nvidia|-[-f]/{ print $2 }
' /var/log/apt/history.log >installation.txt
答案3
Commandline:
从历史记录条目中提取(和过滤)已安装软件包名称的另一种方法apt
是使用单个sed
命令:
sed -e '/^Commandline: apt install /!d' -e 's///' \
-e '/nvidia/d' -e '/--/d' -e '/-f/d' \
</var/log/apt/history.log >installation.txt
两个表达式的第一行首先删除所有不以字符串 开头的输入行Commandline: apt install
,然后从以字符串 开头的行中删除该字符串。
第二行包含一系列表达式,用于删除包含三个字符串nvidia
、--
或中任意一个的行-f
。
第三行包含输入和输出重定向。
列出系统上手动安装的软件包的另一种可能方法是使用
apt list --installed | sed -e '/automatic/d' -e 's,/.*,,'
...列出所有已安装的软件包,同时从列表中删除作为自动依赖项安装的任何内容(这个笨拙的命令还将删除atuomatic
名称中包含该字符串的任何软件包)。