현재 설치된 커널 목록이 있고 현재 설치된 커널과 이전에 설치된 커널을 파악하려고 합니다. 이 예에서 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