現在インストールされているカーネルのリストがあり、現在インストールされているカーネルと以前にインストールされたカーネルを特定しようとしています。この例では、linux-image-3.2.0-60-genericは現在実行中のカーネルで、インストールされているカーネルは次のようになります。
linux-image-3.2.0-49-generic
linux-image-3.2.0-51-generic
linux-image-3.2.0-52-generic
linux-image-3.2.0-53-generic
linux-image-3.2.0-54-generic
linux-image-3.2.0-55-generic
linux-image-3.2.0-56-generic
linux-image-3.2.0-57-generic
linux-image-3.2.0-58-generic
linux-image-3.2.0-59-generic
linux-image-3.2.0-60-generic
linux-image-3.2.0-61-generic
linux-image-3.2.0-63-generic
linux-image-3.2.0-64-generic
grep -v $(uname -r)
このリストから現在実行中のカーネルを削除するために使用できます。ただし、grep -v -B 1 $(uname -r)
リストから現在および前のコアを削除できないようです。-B
とを組み合わせる方法はありますか-v
?それとも完全に間違った方向から接近しているのでしょうか?
答え1
2 grepを使って欲しいものを得ることができます。内部的には、現在のカーネルと以前のバージョンのgrep
一致する「リスト」が生成されます。uname -r
外部では、grep
この2つのコアを除くリストを提供します。
$ grep -v "$(grep -B 1 "$(uname -r)" list.txt)" list.txt
はい
あなたが持っているものをシミュレートするためにそれをファイルに追加しましたlist.txt
。
$ cat list.txt
linux-image-3.2.0-49-generic
linux-image-3.2.0-51-generic
linux-image-3.2.0-52-generic
linux-image-3.2.0-53-generic
linux-image-3.2.0-54-generic
linux-image-3.2.0-55-generic
linux-image-3.2.0-56-generic
linux-image-3.2.0-57-generic
linux-image-3.2.0-58-generic
linux-image-3.2.0-59-generic
linux-image-3.2.0-60-generic
linux-image-3.2.0-61-generic
linux-image-3.2.0-63-generic
linux-image-3.2.0-64-generic
それでは、コマンドが次の文字列を返すとしますuname -r
。
$ uname -r
3.2.0-60-generic
uname -r
したがって、このコマンドを実行すると、以前のバージョンを除いたカーネルのリストが表示されます。
$ grep -v "$(grep -B 1 "3.2.0-60-generic" list.txt)" list.txt
linux-image-3.2.0-49-generic
linux-image-3.2.0-51-generic
linux-image-3.2.0-52-generic
linux-image-3.2.0-53-generic
linux-image-3.2.0-54-generic
linux-image-3.2.0-55-generic
linux-image-3.2.0-56-generic
linux-image-3.2.0-57-generic
linux-image-3.2.0-58-generic
linux-image-3.2.0-61-generic
linux-image-3.2.0-63-generic
linux-image-3.2.0-64-generic
これはすべてカーネルリストがlist.txt
ソートされた形式であると仮定します。
追加のヒント
興味があれば、このQ&Aに次のような回答を書きました。インストールされているトップバージョンのカーネルRPMをプログラムで確認するには?私はそれを使用する方法を示していますsort -V
。
答え2
リストで述べたように、リストがファイルのどこかにあるとします。ただし、このコマンドは簡単に変更できます。
より簡単な方法は、
current_ver=$(uname -r)
awk "/$current_ver/{y=1;next}y" list
このcurrent_ver
変数は現在のカーネルバージョンを保存します。このawk
コマンドは、現在のバージョン以降の出力を取得します。
添付:
私はあまり上手ではありませんawk
。コマンドは間違いなくさらに改善することができます :)
答え3
ここでは間違いなくLinuxを使用しているので、GNUを使用して結果をバージョン別にソートls
できます。-v
これを念頭に置いて、カーネルファイル名に奇妙な文字が含まれる可能性はほとんどなく、次のようにすることができます。
ls -1v /boot/linux-image* | grep "$(uname -r)" -B1