또는 명령을 free
사용하여 열을 인쇄하는 방법은 무엇입니까 ?awk
sed
vmstat
버전 열에 따라 free
5번 열에서 다른 열로 변경될 수 있습니다.
bash-3.00$ vmstat 1 1|tail -2
r b w swap free re mf pi po fr de sr s0 s1 s3 -- in sy cs us sy id
0 0 0 38018936 24998752 122 182 33 81 53 0 0 5 7 -0 0 4113 8416 4527 1 0 99
bash-3.00$ vmstat 1 1|tail -2|awk '{print $5}'
free
24998752
답변1
입력의 첫 번째 줄에서는 모든 필드를 반복하여 string 과 같은 필드를 찾습니다 free
. 이 필드 번호를 기억한 다음 이를 사용하여 해당 필드만 출력합니다.
awk 'NR==1 { for (i=1;i<=NF;++i) if ($i=="free") { n=i; break }} { print $n }'
이로 NR==1
인해 다음 블록은 첫 번째 행(즉, 헤더 행)에 대해서만 실행됩니다. 이 변수는 n
필드의 필드 번호를 보유합니다 free
.
제공한 데이터에 대해 테스트합니다 vmstat 1 1|tail -2
(여기에 있는 파일에서 읽기 file
).
$ awk 'NR==1 { for (i=1;i<=NF;++i) if ($i=="free") { n=i; break }} { print $n }' file
free
24998752
내 원래 답변은 FNR
대신 을 사용합니다 NR
. 불행하게도 awk
해당 변수는 SunOS에서 사용할 수 없지만 FNR
이 경우 NR
다른 항목을 변경하지 않고 사용할 수 있습니다.
vmstat
또한 일부 시스템의 출력에는 free
열이 다음과 같이 표시 됩니다 fre
(예: OpenBSD). 이것은 당신을 의미합니다가능한$i ~ "^fre"
대신 사용하고 싶습니다 $i == "free"
.
답변2
csvcut
다음 도구를 사용하세요 .csvkit:
vmstat 1 1 | tail -2 | tr -s ' ' | csvcut -d ' ' -c free
또는
vmstat 1 1 | tail -2 | csvcut -d ' ' -S -c free
답변3
나는 다음 방법으로 그것을했다
for ((i=1;i<=10;i++)); do free -mh| awk -v i="$i" '$i=="free"{x=NR+2}(NR<=x) {print $i}'; done
output
for ((i=1;i<=10;i++)); do free -mh| awk -v i="$i" '$i=="free"{x=NR+2}(NR<=x) {print $i}'; done
free
859M
0B
praveen@praveen:~$
답변4
이것은: vmstat 1 1 | sed -e 's/ +/ /g' | tail -2
또는 다음과 같습니다: vmstat 1 1 | tail -2 | tr -s ' ' |