awk 截取(gawk gnu awk)
语法
awk 'BEGIN{commands}pattern{commands}END{commands}'file1
[root@host emm]# awk -F: 'BEGIN{print"########start###########"}$3>500&&$3<2000{print $1,$3} END{print"###end###"}' /etc/passwd
#num=0定义变量 #预定义变量↓ #NR number of record 行号 #NF number of field 字段数 #length() 内置的函数,用来统计字符串的长度 #$NF 最后一个字段
awk -F":" '{print #1,$2}' /etc/passwd
#print是awk内部的命令,用于输出
#, 引用输出分隔符,默认输出分隔符是1个空格
[root@host emm]# awk -F: 'OFS="#"{print $1,$1,$3}' /etc/passwd|head -2
root#root#0
bin#bin#1
#指定分隔符
[root@host emm]# awk -F: '/^[^h]/{print $1}' /etc/passwd
#不显示以h开头的行的第一列
[root@host emm]# awk -F:'[:/]' '{print $1}' /etc/passwd
#以:或者/为分隔符
[root@host emm]#awk -F"[ :]+" '{print $2}' 文件
#连续的空格和:当作一个分割符号
#tr -s ""将连续的空格压缩成一个空格
-
-F 指定输入分隔符,默认的分隔符是空白(空格+tab,enter)
-
OFS指定输出分割符,OFS=“#”(output field separater)
-
FS指定输入分隔符 aw8、k 'FS=":" {print $1}' /etc/passwd
数据格式字段
awk命令的操作符
-
~波浪号表示匹配后面的模式(模糊匹配)
awk使用shell
name=mengmeng
useradd mengmeng
useradd mengmeng1
useradd mengmeng2
[root@host lianxi]# awk -F: "\$0 ~/$name/ {print \$0}" /etc/passwd
mengmeng:x:2017:2017::/home/mengmeng:/bin/bash
mengmeng1:x:2018:2018::/home/mengmeng1:/bin/bash
mengmeng2:x:2019:2019::/home/mengmeng2:/bin/bash
awk 中的字段求和
[root@host lianxi]# awk 'NR>1{sum+=$3}END{print sum}' grade.txt
240
awk的内置函数length,substr
统计没有设置密码的用户的数量,同时输出用户名 /etc/shadow
[root@host lianxi]# awk -F: 'length($2)<=2 {print $1;sum++}END{print sum}' /etc/shadow
统计没有设置密码的用户的数量,同时输出用户名前两个字符 /etc/shadow
[root@host lianxi]# awk -F: 'length($2)<=2 {print substr($1,1,2);sum++}END{print sum}' /etc/shadow
awk的if语句
#一个判断语句放在外面
[root@host lianxi]# cat /etc/passwd|awk -F: 'length($1)==3{print $0}'
#使用if放在{}里面
[root@host lianxi]# cat /etc/passwd|awk -F: '{if (length($1)==3) print $0}'
#if双分支
[root@host lianxi]# cat /etc/passwd|awk -F: '{if (length($1)==3) print $0; else print $1}'
awk里的数组
[root@host lianxi]# awk -F: '{user[$1]=$3}END{for (i in user) print user[i]}' /etc/passwd
[root@host lianxi]# awk '{vote[$1]+=$3}END{for (i in vote) print i,vote[i]}' vote.txt |sort -k 2 -n
河南 6
江西 9
山东 12
湖南 43
#i是key,user[i]就是对应里面的值,sort -k根据第2个字段排序,-n升序 -rn降序
awk的system
awk的split
[root@host 7_6]# ip add|awk '/inet.*ens[0-9]+$/{split($2,ip,"/")}END{for (i in ip) print i,ip[i]}'
awk 的tolower和toupper
[root@host 7_6]# awk -F: '{print toupper($1)}' /etc/passwd