如何在带有 awk 的 shell/终端中使用 for 循环?

pra*_*tis 2 command-line dpkg awk text-processing

命令

dpkg -l | awk '$2=="ufw" {sub("ubuntu[^[:alpha:]]*$", "", $3); print $3"\t"$2}'
Run Code Online (Sandbox Code Playgroud)

输出:

0.34~rc-0   ufw
Run Code Online (Sandbox Code Playgroud)

现在$2=="ufw",我不想像那样指定包名,而是想迭代并获取所有包的列表,如下所示:

2.20.1-5.1   util-linux
1.0.2-1  zerofree
0.34~rc-0   ufw
Run Code Online (Sandbox Code Playgroud)

编辑
自己犯了一个语法错误。我应该直接使用相同的命令,删除$2=="ufw". 答案是dpkg -l | awk '{sub("ubuntu[^[:alpha:]]*$", "", $3); print $3"\t"$2}'

mur*_*uru 5

您可以告诉dpkg列出特定包的详细信息:

$ dpkg -l util-linux ufw
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                                         Version                     Architecture                Description
+++-============================================-===========================-===========================-==============================================================================================
ii  ufw                                          0.35-0ubuntu2               all                         program for managing a Netfilter firewall
ii  util-linux                                   2.27.1-6ubuntu3.1           amd64                       miscellaneous system utilities
Run Code Online (Sandbox Code Playgroud)

然后你只需要过滤掉标题。

更容易的是直接使用dpkg-query和设置格式:

$ dpkg-query -W --showformat '${Version}\t${Package}\n' util-linux ufw
0.35-0ubuntu2   ufw
2.27.1-6ubuntu3.1   util-linux
Run Code Online (Sandbox Code Playgroud)

然后,在 中awk,您只需要ubuntu...像当前一样删除该部分,无需任何过滤。