"df" 출력의 "grep" 여유 공간

"df" 출력의 "grep" 여유 공간

안녕하세요, grep df의 출력이 필요합니다. 불행히도 awk는 옵션이 아니며(간단한 옵션임에도 불구하고) 여기서는 grep만 사용할 수 있습니다.

Filesystem           1K-blocks      Used Available Use% Mounted on
none                         4         0         4   0% /sys/fs/cgroup
none                      5120         0      5120   0% /run/lock
none                   1981488       444   1981044   0% /run/shm
none                    102400        64    102336   0% /run/user
/dev/sda3            418176236 281033024 137143212  67% /media/mark/7EE21FBAE21F761D

예를 들어 /dev/sda3으로 시작하는 행에 $4 열을 원합니다.

답변1

-P(perl 호환 정규 표현식, PCRE) 및 (일치하는 문자열만 인쇄)을 지원하는 grep 버전이 있는 경우 -o다음을 수행할 수 있습니다.

df | grep -oP '/sda3.* \K\d+(?=\s+\d+%)' 

설명하다

여기에서는 를 일치시킨 다음 /sda3마침표( \d+), 하나 이상의 공백( \s+), 하나 이상의 숫자( \d+) 및 a 가 나올 때까지 가능한 한 많은 문자를 일치시킵니다 %. 구성 foo(?=bar)긍정적 인 전망foo, string 이 뒤에 오는 경우에만 문자열을 검색할 수 있습니다 bar. 이것은 \K"지금까지 일치하는 항목을 모두 삭제"를 의미하는 PCRE 트릭입니다. 와 함께 사용하면 -o패턴 앞의 문자열을 사용하여 일치 항목을 고정할 수 있지만 인쇄할 수는 없습니다.

그렇지 않으면 -P상황이 더 까다로워집니다. 여러 번 통과해야 합니다. 예를 들어:

df | grep -o '/sda3.*%' | grep -Eo '[0-9]+ *[0-9]+%' | grep -Eo '^[0-9]+'

설명하다

여기서 첫 번째는 grep올바른 행을 식별하고 까지 인쇄합니다 %. 두 번째는 공백 앞에 가장 긴 숫자를 인쇄하고, 로 끝나는 다른 숫자 세그먼트를 인쇄하고 %, 마지막은 행 시작 부분에서 찾은 가장 긴 숫자를 인쇄합니다. 이전 버전에서는 사용 가능한 공간과 백분율만 인쇄했으므로 이것이 사용 가능한 공간입니다.

grep이것을 지원하지 않는다면 다음 -E과 같이 할 수 있습니다.

df | grep -o '/sda3.*%' | grep -o '[0-9]* *[0-9]*%' | grep -o '[0-9][0-9]* '

설명하다

여기서는 +"one or more"를 사용할 수 없으므로 마지막 숫자에는 grep최소한 하나의 숫자와 0 이상의 숫자( [0-9][0-9]*)를 지정해야 합니다.


물론, 마음대로 사용할 수 있는 다른 도구가 있으면 작업이 훨씬 쉬워집니다.

df | sed -n '/sda3/{s/  */ /gp}' | cut -d' ' -f4

설명하다

현재 행이 ( )와 일치하지 않는 한 아무것도 인쇄되지 않으며 sed일치하는 경우 모든 연속 공백을 단일 공백으로 대체하여 네 번째 필드가 인쇄되도록 합니다.-nsda3/sda3/{}cut


또는

df | perl -lne 'm#/sda3.+\s(\d+)\s+\d+%# && print $1' 

설명하다

-l각 인쇄 호출에 줄바꿈을 추가합니다. 이는 -n"입력을 한 줄씩 읽음"을 의미하며 -e명령줄에서 스크립트를 전달할 수 있도록 합니다. 스크립트는 자체적으로 일치 sda3한 다음 공백까지의 문자 시퀀스, 하나 이상의 숫자( \s(\d+)), 공백, %( ) \s+\d+로 끝나는 일련의 숫자 순으로 일치합니다. 괄호는 관심 있는 부분을 캡처한 다음 $1.


또는

df | tr -s ' ' $'\t' | grep sda3 | cut -f4

설명하다

여기서는 tr여러 연속 공백을 탭(sda3의 기본 구분 기호 cut)으로 변환한 다음 grep4번째 필드를 인쇄하는 데 사용합니다.

답변2

사용하는 방법 grep 귀하가 요청한 방식으로 해결하여 답변을 받았습니다.
이 답변은 해결 방법에 관한 것입니다.질문 - 개별 값을 가져옵니다. df:

GNU에는 출력에 표시되는 열을 지정 df하는 옵션이 있습니다 .coreutils

$ df --output=avail /dev/sda3
  Avail
9816416

안타깝게도 열 헤더를 억제하는 옵션이 없으므로 다음과 같은 추가 단계를 통해 삭제해야 합니다 tail.

$ df --output=avail /dev/sda3 | tail -n 1
9816416

또는 grep원하는 경우:

$ df --output=avail /dev/sda3 | grep '[0-9]'
9816416

답변3

grep 버전에 따라 -ofor only 및 -Efor를 사용하여 정규식을 확장할 수도 있습니다.

그래서 당신은 사용할 수 있습니다

df | grep /dev/sda3 | grep -E -o "[[:digit:]]+[[:space:]]+[[:digit:]]+%" | grep -E -o ".+\s"

이를 위해서는 %첫 번째 grep의 앵커로 char이 필요합니다. 그 후에는 두 번째 grep을 위한 공간까지 첫 번째 문자를 얻게 됩니다.

관련 정보