于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)
--------------------未完待续--------------------