sed +는 한 줄에서 단어 앞의 값을 찾습니다.

sed +는 한 줄에서 단어 앞의 값을 찾습니다.

"무료"라는 단어 앞의 값을 찾는 방법은 무엇입니까?

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에서 테스트되었으나 freeSolaris에서 사용 가능한지는 확실하지 않음).

free | awk '/Mem/{print $4}'

작업을 위해 설계된 또 다른 도구(Linux 및 Solaris에서 실행되어야 함):

vmstat 2 2 | tail -n 1 | awk '{print $4}'

소스 코드로 이동합니다(Linux에서는 작동하지만 Solaris에서는 작동하는지 확실하지 않음).

awk '/MemFree/{print $2}' /proc/meminfo 

관련 정보