想要获得该示例中标题中的最后一列是“db5b”,并将其放入下一行的第一列。
输出:
Filesystem utilization for db5b
/dev/hd4 3.00 2.87 5% 5728 1% /
/dev/hd2 7.00 2.79 61% 61845 9% /usr
/dev/hd9var 7.00 5.88 17% 861 1% /var
/dev/hd3 3.00 2.98 1% 205 1% /tmp
预期结果:
db5b 5% /
db5b 61% /usr
db5b 17% /var
db5b 1% /tmp
我使用它但无法弄清楚如何将db5b放在第一列:
awk '{print $3, $7}'
我想如果想用awk完成结果使用NF但不知道如何完成命令。
答案 0 :(得分:2)
像这样,例如:
$ awk 'NR==1 {a=$NF} NR>1 && $0 {print a,$4,$7}' file
db5b 5% /
db5b 61% /usr
db5b 17% /var
db5b 1% /tmp
NR==1 {a=$NF}
,将最后一个字段保存到var a
。NR>1 && $0 {print a,$4,$7}
在第一个带有一些数据之后的行上,打印该值以及第4和第7个字段。对于像Vijay's这样的输入:
$ awk '/Filesystem/ {a=$NF} /^\// {print a,$4,$7}' file
db5b 5% /
db5b 61% /usr
db5b 17% /var
db5b 1% /tmp
db6b 5% /
db6b 61% /usr
db6b 17% /var
db6b 1% /tmp
答案 1 :(得分:1)
这个单行提供你想要的东西:
awk 'NR==1{t=$NF;next}$0{print t,$4,$NF}' file
修改强>
不同的标题:
awk 'NF==4{t=$NF;next}$0{print t,$4,$NF}' file
答案 2 :(得分:1)
awk '$4!~/%/ && NF>0{a=$NF;next}{print a,$4,$7}' your_file
测试:
> cat temp
Filesystem utilization for db5b
/dev/hd4 3.00 2.87 5% 5728 1% /
/dev/hd2 7.00 2.79 61% 61845 9% /usr
/dev/hd9var 7.00 5.88 17% 861 1% /var
/dev/hd3 3.00 2.98 1% 205 1% /tmp
Filesystem utilization for db6b
/dev/hd4 3.00 2.87 5% 5728 1% /
/dev/hd2 7.00 2.79 61% 61845 9% /usr
/dev/hd9var 7.00 5.88 17% 861 1% /var
/dev/hd3 3.00 2.98 1% 205 1% /tmp
> awk '$4!~/%/ && NF>0{a=$NF;next}{print a,$4,$7}' temp
db5b 5% /
db5b 61% /usr
db5b 17% /var
db5b 1% /tmp
db6b 5% /
db6b 61% /usr
db6b 17% /var
db6b 1% /tmp
>
答案 3 :(得分:0)
如果你想要一些非awk: -
#!/usr/bin/env bash
set -x
while read -r
do
output=$(echo "${REPLY}" | tr -s ' ')
drive=$(echo "${output}" | cut -f7)
percent=$(echo "${output}" | cut -f4)
echo -e "db5b\t${percent}\t${drive}"
done < fs_utilisation
-e切换到echo可能只是bash,因此不可移植。如果是这样,我道歉;你必须检查。我之所以使用-e开关是因为它会解释\ t来为你提供字段之间的标签。