grepで-vと-Bスイッチを組み合わせる方法は?

grepで-vと-Bスイッチを組み合わせる方法は?

現在インストールされているカーネルのリストがあり、現在インストールされているカーネルと以前にインストールされたカーネルを特定しようとしています。この例では、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

関連情報