使用 awk 匹配列标题并打印列的值

使用 awk 匹配列标题并打印列的值

如何free使用awkorsed命令打印列?

取决于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.不幸的是,awkSunOS 上没有该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

相关内容