如何free
使用awk
orsed
命令打印列?
取决于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' | sed -e 's/ +/ /g' |尾部-2 |切-d''-f5
或者这样: vmstat 1 1 |尾部-2 | tr -s ' ' |切-d''-f5