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

관련 정보