"무료"라는 단어 앞의 값을 찾는 방법은 무엇입니까?
top -n1 | grep Mem
Mem: 2054968k av, 2034120k used, 20848k free, 0k shrd, 186768k buff
먼저 시도했습니다
top -n1 | grep Mem | awk '{print $7}'
하지만 이는 자유 값(여기서는 20848k)이 다른 필드에 있을 수 있기 때문에 좋지 않습니다. 필드 6인 경우도 있고 필드 7인 경우도 있습니다.
Linux와 Solaris 모두에서 작동하려면 이것이 필요합니다.
답변1
$ top -bn1 | grep free
KiB Mem: 8117084 total, 6578888 used, 1538196 free, 302216 buffers
KiB Swap: 8060924 total, 26004 used, 8034920 free, 1564856 cached
$ top -bn1 | grep -oP '\S+(?=\s+free)'
1544132
8034920
GNU grep이 필요하지만 "linux" 태그를 지정했으므로 문제 없습니다.
"멤"에만 해당:
top -bn1 | grep -oP 'Mem.*\s\K\S+(?=\s+free)'
답변2
awk -v RS="[, ]" '/free/{print a}{a=$0}'
설명하다
- 레코드 구분 기호를 로 설정
,
하면space
각 문자열 앞의 숫자 자체가 레코드이고 문자열도 레코드가 됩니다. - 모든 것을 자체 기록으로 유지하면 awk가 각 항목을 하나씩 처리합니다.
- 모든 이전 레코드의 경우 조건이 일치하지 않기 때문에
free
무시 하고 현재 처리된 레코드를 변수에 저장하는 것으로 이동합니다.{print a}
{a=$0}
a
- 일단 일치하면 awk는
/free/
일치 전의 레코드가 포함된{print a}
위치 만 찾습니다.a
답변3
GNU 사용 sed
(Linux에만 해당):
top -bn1 | sed -rn '/Mem/{s/.* ([^ ]*) free.*/\1/p;}'
다음 중 하나를 사용하십시오 sed
.
top -bn1 | sed -n '/Mem/{s/.* \([^ ]*\) free.*/\1/p;}'
사용 perl
:
top -bn1 | perl -lne '/Mem.* ([\d]+)\s*free/ && print $1'
작업용으로 설계된 도구를 사용하십시오(Linux에서 테스트되었으나 free
Solaris에서 사용 가능한지는 확실하지 않음).
free | awk '/Mem/{print $4}'
작업을 위해 설계된 또 다른 도구(Linux 및 Solaris에서 실행되어야 함):
vmstat 2 2 | tail -n 1 | awk '{print $4}'
소스 코드로 이동합니다(Linux에서는 작동하지만 Solaris에서는 작동하는지 확실하지 않음).
awk '/MemFree/{print $2}' /proc/meminfo