awk 多个分隔符

1
2
echo "abcdefg" | awk -F '[ce]' '{print $1,$2,$3}'
ab d fg

但是我想要提取 dmesg 里面的时间,想以 [] 来做分割,这个时候可以反写 [] 取个巧

1
dmesg | awk -F '[][]' '{print $2}'

打印某一列为特定值的行

1
awk '$8=="500"' nginx_access.log

awk 交换一个文件的两列

比如文件 test.txt

1
2
3
4
a;b;c
d;e;f
1;2;3
4;5;6

方法 1

1
awk -F ';' '{printf("%s;%s;%s\n",$3,$2,$1)}' test.txt

方法 2

1
2
3
awk -F ';' '{temp = $3 ; $3 = $1; $1 = temp}1' OFS=';' test.txt

这里的1 和 {print}是一样的, OFS代表分隔符。

找出某一列是指定值的行

比如我想知道根目录的磁盘占用情况

1
2
3
4
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/sdc ext4 251G 13G 226G 6% /
none tmpfs 3.9G 68K 3.9G 1% /mnt/wslg
none tmpfs 3.9G 4.0K 3.9G 1% /mnt/wsl
1
2
df -hT | awk '($NF=="/"){print $(NF - 1)}'
# $(NF - 1) 倒数第二列

输出结果为:

6%

awk 多个条件判断

原始输出:

1
2
3
4
5
[root@qz_k8s_m1 data]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
test-7b47f8cccb-cwdfw 1/1 Running 0 3h28m
test-6c5bbd4f49-ns74j 0/1 Running 92 6h55m
test-7c78fbdf68-cg28l 1/1 Running 0 8d
1
2
3
4
5
6
7
8
9
10
11
# 找出其中未就绪且重启次数大于10次的pod
[root@qz_k8s_m1 data]# kubectl get pod -n dev | awk '($2=="0/1" && $4>10)'
test-6c5bbd4f49-ns74j 0/1 Running 93 6h57m

# 可以只打印pod名字
[root@qz_k8s_m1 data]# kubectl get pod -n dev | awk '($2=="0/1" && $4>20) {print $1}'
test-6c5bbd4f49-ns74j


# 不打印第一行
kubectl get deployment | awk 'NR>1 {print $1}'