我想知道是否有人能帮我理解下面的命令。此命令的目的是清除旧内核,但我想了解语法:
dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | xargs sudo apt-get -y purge到目前为止,这就是我所拥有的:
dpkg -l 'linux-*' - list包包含"linux-*“模式
sed‘/^ii/!d;/’.-查找以ii开头的行,但不包含d;
$(uname -r sed“s/(.*)-(^ 0-9 +)/\1/”)“/d-命令替换以列出当前内核并仅从版本sed”/(.*).中提取数字--搜索任意数量的字符.(^0-9.-从数字0-9开始,我不明白这一点):
我完全迷上了这个:
)./\1/;/0-9/!d' s/^^* (^ -是否正在查找启动字符串的空字符?
问候
发布于 2012-08-11 09:02:17
因此,这里有一个很长的sed命令来分析:
'/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'它提供了一个与dpkg语法中的'linux-*‘匹配的包列表,这是有点神秘的,但是行的开头表示有关包状态的信息。
sed命令本身是相当长的(尽管我犯了更糟的错误!),但是相当简单,没有循环或复杂。正如“精细手册”所告诉你的那样,sed接受程序作为用分号分隔的命令列表。因此,给定的sed程序有四个命令。
第一,'/^ii/!d‘。我们删除不以“ii”开头的行。很简单。我们正在寻找已安装的软件包来删除。
第二,$‘/’$(uname -r x sed "s/(.*)-(^0-9+)/\1/")"'/d‘。这是命令行中的命令行(使用bash的$()语法),因此我们将从内到外工作。其目的显然是从我们当前运行的内核的包列表中筛选出来,这样我们就不会删除它。uname -r的输出与debian包名称不完全匹配,因此它从“3.0.0-泛型”之类的内容过滤到了"3.0.0“。内部sed命令“s/(.*)-(^0-9+)/\1/”只是一个简单的正则表达式搜索和替换,它在任何连字符之后切断输入的末尾。在$()替换之后,外部sed命令看起来像'/3.0.0/d‘(取决于正在运行的内核)。它只删除包含当前内核版本号的行。
第三和第四,‘s/^*^* (^ )./\1/’和'/0-9/!d‘是最后的过滤器。第一个是基本的搜索和替换(在awk中要清楚得多),它提取行的第三个字段,即包名,然后我们删除不包含数字的行(否则我们会删除引入内核升级的元包)。
最后,xargs逐行获取它的输入,并在每一行上运行传递它的命令,并将该行附加到其参数中。所以,我们把找到的每一个包裹都拿掉。
https://stackoverflow.com/questions/11913014
复制相似问题