于2022年1月10日,写遇到,特地整理了一些

1.过滤 简洁高级的感觉

一般可以这样子实现。

[root@master ~]# zookeeper_node=`cat /etc/hosts|grep zk|awk '{print $1}'`;echo ${zookeeper_node[0]}
192.168.8.10 192.168.8.11 192.168.8.12

但是 cat 这样子使用会比较low,于是发现还可以这样

[root@master ~]# zookeeper_node=($(awk -F ' ' '/zk/{print $1}' /etc/hosts));echo ${zookeeper_node[0]}
192.168.8.10

然后上面是数组的表现形式,常用赋值字符串如下

[root@master ~]# zookeeper_node=$(awk -F ' ' '/zk/{print $1}' /etc/hosts);echo ${zookeeper_node}
192.168.8.10 192.168.8.11 192.168.8.12

但是数组的用途就会更适合使用,比如

分别取出指定地址

[root@master ~]# zookeeper_node=($(awk -F ' ' '/zk/{print $1}' /etc/hosts));echo ${zookeeper_node[0]}
192.168.8.10
[root@master ~]# zookeeper_node=($(awk -F ' ' '/zk/{print $1}' /etc/hosts));echo ${zookeeper_node[1]}
192.168.8.11
[root@master ~]# zookeeper_node=($(awk -F ' ' '/zk/{print $1}' /etc/hosts));echo ${zookeeper_node[2]}
192.168.8.12

查看数组的所有元素 (* 代表 ‘元素1 元素2 元素3’是一个字符串输出)(@代表的是 ‘元素1’ ‘元素2’ ‘元素3’  三个独立的个体)

[root@master ~]# zookeeper_node=($(awk -F ' ' '/zk/{print $1}' /etc/hosts));echo ${zookeeper_node[*]}
192.168.8.10 192.168.8.11 192.168.8.12
[root@master ~]# zookeeper_node=($(awk -F ' ' '/zk/{print $1}' /etc/hosts));echo ${zookeeper_node[@]}
192.168.8.10 192.168.8.11 192.168.8.12

查看数组的元素个数

[root@master ~]# zookeeper_node=($(awk -F ' ' '/zk/{print $1}' /etc/hosts));echo ${#zookeeper_node[@]}
3
[root@master ~]# zookeeper_node=($(awk -F ' ' '/zk/{print $1}' /etc/hosts));echo ${#zookeeper_node[*]}
3

查看数据的第几个元素的长度(从0开始)

[root@master ~]# zookeeper_node=($(awk -F ' ' '/zk/{print $1}' /etc/hosts));echo ${#zookeeper_node[2]}
12

 2.条件筛选

匹配字段,打印列值

比如

[root@master ~]# grep  192 /etc/hosts |head -n 5
192.168.8.10    master
192.168.8.11    slave1
192.168.8.12    slave2
192.168.8.10    zk1
192.168.8.11    zk2
[root@master ~]# awk 'BEGIN {FS=" "} ($2 == "master"||$2 ~ "slave") {print $1}' /etc/hosts
192.168.8.10
192.168.8.11
192.168.8.12
[root@master ~]# awk 'BEGIN {FS=" "} {if ($2 == "master") {print $1}}' /etc/hosts
192.168.8.10
[root@master ~]# awk 'BEGIN {FS=" "} {if ($2 ~ "master") {print $1}}' /etc/hosts
192.168.8.10
[root@master ~]# awk 'BEGIN {FS=" "} {if ($2 == 'master') {print $1}}' /etc/hosts

[root@master ~]# awk -F ' ' '$2 ~ /master/{print $1"  this is ywjia  "$2}' /etc/hosts
192.168.8.10  this is ywjia  master

 

 

 

 3.行列  NF  NR

打印包含 master  zk 的行的列数

[root@master ~]# awk '/master/{print NF}' /etc/hosts
2
[root@master ~]# awk '/zk/{print NF}' /etc/hosts
2
2
2
[root@master ~]# grep 192 /etc/hosts|head -n 6 192.168.8.10 master 192.168.8.11 slave1 192.168.8.12 slave2 192.168.8.10 zk1 192.168.8.11 zk2 192.168.8.12 zk3
符合zk的有三行,每行有两列

NF表示列  NR表示行

 打印 列值为5 的行,全部内容,最后一列内容,最后倒第二列,正数第五列

[root@master ~]# awk 'NF == 5 {print}' /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@master ~]# awk 'NF == 5 {print $0}' /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@master ~]# awk 'NF == 5 {print $NF}' /etc/hosts
localhost4.localdomain4
localhost6.localdomain6
[root@master ~]# awk 'NF == 5 {print $(NF-1)}' /etc/hosts
localhost4
localhost6
[root@master ~]# awk 'NF == 5 {print $(5)}' /etc/hosts
localhost4.localdomain4
localhost6.localdomain6

打印一个文件 ,带有行号。

[root@master ~]# cat -n /etc/hosts

    21    192.168.8.15    ldv
    22    192.168.8.13    lczy.algorithm.com
    23    

awk的打开方式  21行之后的全部内容 同时打印行号和制表符

[root@master ~]# awk '(NR >= 21) {print NR".\t"$0}' /etc/hosts
21.    192.168.8.15    ldv
22.    192.168.8.13    lczy.algorithm.com
23.    

制表符 \t   换行符\n  回车键\r  下面看一下效果

[root@master ~]# echo -e "a\tb"  ; echo -e "c\nd" ; echo -e "e\rf" ; echo -e " m \r n "
a    b
c
d
f
 n 

最后匹配行数  …………^表示开头   $表示结尾

[root@master ~]# awk 'BEGIN {x=0} /^$/{x=x+1} END {print "发现文件存在" " "x" " "空行"}' /etc/hosts
发现文件存在 2 空行
[root@master ~]# awk 'BEGIN {x=0} /^192/{x=x+1} END {print "发现文件存在" " "x" " "空行"}' /etc/hosts
发现文件存在 19 空行
[root@master ~]# awk 'BEGIN {x=0} /$1/{x=x+1} END {print "发现文件存在" " "x" " "空行"}' /etc/hosts
发现文件存在 0 空行
[root@master ~]# awk 'BEGIN {x=0} /1$/{x=x+1} END {print "发现文件存在" " "x" " "空行"}' /etc/hosts
发现文件存在 2 空行

 

 4.计算

 这个没啥好说的。 第一个变量的平方再加上1   .字符平方为0

[root@master ~]# awk '{print ($1**2) +1 }' /etc/hosts |head -n 6
16130
1
1
36929.5
36929.5
36929.5
[root@master ~]# head -n 6 /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.8.10    master
192.168.8.11    slave1
192.168.8.12    slave2

[root@master ~]# awk -F " " '{print ($1**2) +1 }' /etc/hosts |head -n 6
16130
1
1
36929.5
36929.5
36929.5
[root@master ~]# awk -F " " '{print ($2**2) +1 }' /etc/hosts |head -n 6
1
1
1
1
1
1

 

 5.最喜欢的操作 暴力 删除文件  慎重啊

打印命令
[root@master
~]# ls -l |awk '{print "rm -rf " $9}' |head -n 2 rm -rf rm -rf anaconda-ks.cfg
执行删除 [root@master
~]# ls -l |awk '{print "rm -rf " $9}' |head -n 2 |sh
最后查看 [root@master
~]# ls -l |head -n 2 total 1888476 -rw-------. 1 root root 1676 Dec 29 10:38 anaconda-ks.cfg

6. 格式化输出 printf

[root@master ~]# awk -F " " 'NR >= 22 { print $1,$2} '  /etc/hosts
192.168.8.13 lczy.algorithm.com

[root@master ~]# awk -F "" 'NR >= 22 { print $1,$2} '  /etc/hosts
1 9
上面对比 “” “ ”区别
下面: %d 整数  %f 浮点  %s 字符    (1.非整数不服去除   2.字符串设置整数浮点时为0)
正数表示右对齐,负数表示左对齐  20  5.2表示长度  .2表示长度
[root@master ~]# awk -F " " 'NR >= 22 { printf "%20d\t%5.2f\n",$1,$2;} '  /etc/hosts
                 192     0.00
                   0     0.00
[root@master ~]# awk -F " " 'NR >= 22 { printf "%-20d\t%5.2s\n",$1,$2;} '  /etc/hosts
192                        lc
0                            
[root@master ~]# awk -F " " 'NR >= 22 { printf "%-20d\t%52s\n",$1,$2;} '  /etc/hosts
192                                                       lczy.algorithm.com
0                                
[root@master ~]# awk -F " " 'NR >= 22 { printf "%-20s\t%20s\n",$1,$2} '  /etc/hosts
192.168.8.13              lczy.algorithm.com

[root@master ~]# awk -F " " 'NR >= 22 { printf "%-20s\t%.10s\n",$1,$2;} '  /etc/hosts
192.168.8.13            lczy.algor
[root@master ~]# awk -F " " 'NR >= 20 { printf "%-10s\t",$1}; NR>=20 {printf "%50s\n",$2 } '  /etc/hosts
192.168.8.14                                                   lag
192.168.8.15                                                   ldv
192.168.8.13                                    lczy.algorithm.com

 

[root@master ~]# awk -F " " 'BEGIN {print "开始-------->>"} NR == 22 {print $1,$2} END {print "<<[C---------结束"}' /etc/hosts
开始-------->>
192.168.8.13 lczy.algorithm.com
<<[C---------结束
[root@master ~]# awk -F " " 'BEGIN {print "开始-------->>"} NR == 22 {print "%-10s\t%50s\n",$1,$2} END {print "<<[C---------结束"}' /etc/hosts
开始-------->>
%-10s    %50s
192.168.8.13 lczy.algorithm.com
<<[C---------结束
[root@master ~]# awk -F " " 'BEGIN {print "开始-------->>"} NR == 22 {printf "%-10s\t%50s\n",$1,$2} END {print "<<[C---------结束"}' /etc/hosts
开始-------->>
192.168.8.13                                    lczy.algorithm.com
<<[C---------结束

 

 7. 传递参数

方式一: awk  -v

awk -v a="$a" 'BEGIN {FS="@"} { if ($1 > a) print $2 }'

[root@master ~]# j=DataNode;ps -ef |awk -v j="$j" '( $NF ~ j) {print $2} '
26096

 

方式二:"'$a'"

[root@master ~]# j=DataNode;ps -ef |awk  '( $NF ~ "'$j'") {print $2} '
26096
[root@master ~]# j=DataNode;ps -ef |awk  '( $NF ~ "'"$j"'") {print $2} '
26096

其它还有,这里就不拓展了(因为我不会QAQ)

 

 --------------------未完待续--------------------