100G 이상의 디스크 크기를 찾는이 필터를 줄일 수 있습니까?


12

내 목표는 lsblk에서 100G보다 큰 디스크를 얻는 것입니다.

작동하지만 어색합니다. 나는 그것이 단축 될 수 있다고 확신합니다. lsblk와 완전히 다른 것을 사용하거나 awk를 사용하여 사람이 읽을 수있는 숫자를 직접 필터링 할 수 있습니다.

다음은 제가 정리 한 것입니다.

lsblk | grep disk | awk '{print$1,$4}' | grep G | sed 's/.$//' | awk '{if($2>100)print$1}'

100G보다 큰 디스크의 sdx 및 nvmexxx 부분 만 출력합니다. 정확히 내가 필요한 것.

나는 그것에 만족하지만, 당신에게서 더 많은 것을 배우고 싶어합니다.


100-999GB와 100T보다 크지 만 1-99T 사이에는 아무것도 없습니다. (테라 바이트 ~)
hanshenrik

그렇습니다. 내 관심을 끌고 이미 답변에서 논의 된 결함 중 하나입니다. 따라서 사람이 읽을 수있는 대신 바이트 크기를 기준으로 필터를 수행하는 대답을 받아 들였습니다. 다른 방법을 사용한다면 그것에 대해 기꺼이 배울 것입니다.
chalybeum 21

답변:


28

원하는 출력 형식을 지정할 수 있습니다 lsblk.

% lsblk -nblo NAME,SIZE
mmcblk0   15931539456
mmcblk0p1   268435456
mmcblk0p2 15662038528

사용 된 옵션 :

-b, --bytes
      Print the SIZE column in bytes rather than in human-readable format.

-l, --list
      Use the list output format.

-n, --noheadings
      Do not print a header line.

-o, --output list
      Specify which output columns to print.  Use --help to get a list of  all  supported
      columns.

그런 다음 필터링이 더 쉽습니다.

% lsblk -nblo NAME,SIZE | awk '$2 > 4*2^30 {print $1}' # greater than 4 GiB
mmcblk0
mmcblk0p2

귀하의 경우에는 100*2^30100GiB 또는 100e9/ 1e11100GB입니다.


으악, 영리하다! 처음에 필요하지 않은 것을 제거하십시오. 한 가지 질문 : 바이트와의 일관성을 위해 x * 2 ** 30을 사용하고 있습니까? s.th를 사용하는 데 단점이 있습니까? 10 ** 3처럼?
chalybeum

바이트의 경우 @chalybeum 그렇습니다. 아니요, 10 ** 9를 사용할 수 있습니다. 값은 크게 다르지 않습니다.
muru

OP는 one-liner에서 파티션을 필터링합니다.
UncleCarl

@UncleCarl는 지적
muru

1
이 특별한 경우 100G 경계의 awk는 단축되어 egrep '\d{12,}'12 자리 미만의 라인을 순서대로 제거 할 수 있습니다 . Awk는 물론 더 보편적입니다.
Gnudiff

18

lsblkJSON 형식으로 출력하도록 지시하고 다음을 사용하여 필터링을 수행 할 수도 있습니다 jq.

$ lsblk -Jb | jq -r '..|select(.size? >= 1e11).name'
sda
sda2

또는:

$ lsblk -Jb | jq -r '..|select(.type? == "disk" and .size? >= 1e11).name'
sda

유형의 항목으로 제한합니다 disk.

( 100GB 임. 100GiB로 (또는 )로 1e11교체하십시오 . 반올림으로 인해 약 99.9278에서 100.0488GiB 범위의 크기에 대해 100G 가없는 자체 보고 (어떤 이유로))107374182400100*1024*1024*1024lsblk-b

lsblk -OJb, lsblk좀 더 벌금 그레인 선택 또는 출력 더 이상 관련 정보를 수행 할 수있는 모든 가능한 정보를보고합니다.

에서 직접 정보를 얻을 수도 있습니다 /sys. 로 zsh:

$ printf '%s\n' /sys/class/block/*(e'[(($(<$REPLY/size) * 512 >= 1e11))]':t)
sda
sda2

이것은 전문가의 진정한 답변이며 아무도 읽을 수 없습니다. : D
Archemar

나는 이것을 좋은 것으로 받아들입니다. 그러나 배쉬 여행 의이 단계에서 나는 또 다른 도구를 사용하여 더 복잡한 것을 도입하고 싶지 않습니다.
chalybeum

그것은 jq(몇 달 전에 배운) 좋은 응용 프로그램입니다 .
Dubu

6

시험

lsblk| awk '$4 ~ /G$/ && $4+0 > 100 {print $1}'

동시에 grep하고 필터링합니다.

  • $4 ~ /G$/ 크기를 G로 정리하다
  • $4+0 > 100 100G 이상 크기 확보
  • {print $1} 이름을 새기다

원칙적으로는 사용할 필요가 없습니다 안됩니다 grepawk같은 파이프.

디스크 만 (파티션없이) 얻으려면 : awk 필터링

lsblk| awk '$4 ~ /G$/ && $4+0 > 100 && $6 == "disk"  {print $1}'

어디

  • $6 == "disk" 디스크가있는 열만 선택

디스크 만 (파티션없이) 얻으려면 : lsblk 필터링

lsblk --nodeps| awk '$4 ~ /G$/ && $4+0 > 100 {print $1}'

어디

  • --nodeps : -d, --nodeps는 슬레이브 또는 홀더를 인쇄하지 않습니다

거의 다 왔어. 여전히 파티션을 인쇄합니다. 그러나 나는 자유 시간이 조금 있으면 그 뒤에 갈 수 있다고 생각합니다.
chalybeum

1
@ chalybeum 나는 muru의 대답에 동일한 필터링 트릭을 적용 할 수 있다고 고쳤습니다.
Archemar

(아마도 --no-deps그 대답의 일반적인 스타일을 유지하면서 옵션을 사용할 것입니다 )
muru

2
이 크기가 테라 바이트 (또는 더 큰 단위)로 표시되는 디스크를 잡을 수 없을 것 같습니다.
fra-san

@ fra-san 페어 포인트이며 내 원래 솔루션에도 적용됩니다. 그래서 여기에서 디스크 필터 비트를 가져 와서 바이트 변환에 넣습니다.
chalybeum
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.