안녕하세요, 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
일치하는 경우 모든 연속 공백을 단일 공백으로 대체하여 네 번째 필드가 인쇄되도록 합니다.-n
sda3
/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
)으로 변환한 다음 grep
4번째 필드를 인쇄하는 데 사용합니다.
답변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 버전에 따라 -o
for only 및 -E
for를 사용하여 정규식을 확장할 수도 있습니다.
그래서 당신은 사용할 수 있습니다
df | grep /dev/sda3 | grep -E -o "[[:digit:]]+[[:space:]]+[[:digit:]]+%" | grep -E -o ".+\s"
이를 위해서는 %
첫 번째 grep의 앵커로 char이 필요합니다. 그 후에는 두 번째 grep을 위한 공간까지 첫 번째 문자를 얻게 됩니다.