awk命令
和cut相似,cut小巫
awk大巫
awk处理原理:
一行一行地处理
awk基本语法
awk -F 分割符 ‘/模式/{动作}’输入文件
awk完整语法:
awk BEGIN{commands}pattern{commands}END{commonds}‘file1
先执行BEGIN,从file1读取第一行有无模式匹配,若无则执行{}中的语句,有模式
匹配,若匹配,就执行{}里的语句,不匹配就不执行,接着读取下一行,重复,最后
执行END的语句
一些命令
分割符
1输出分割符: awk -F =awk ‘BEGIN{FS=“:”}’ 加分割符 默认是空白(tab和空格)
OFS输出分割符
cat grade.txt|awk 'BEGIN{OFS="#"} $2>=90{print $1,$2}' OFS自定义的用法 {}之前没有条件,可以加OFS,不用BEGIN
FS输入分割符
NR表示有多少行 从零开始
NR==5,NR==10 从5到10行 ——》 NR>=5&&NR
NR==5||NR==10 5行和10行
NR%5==0 里面要用双等号
NF表示一行有多少列的字段数
awk ‘NR==1{print $0 }’截取第一行
awk 'NR>1{print $0}' NR表示awk处理文本的行号 NR>1 显示行数大于1, $0表示输出整行
cat grade.txt |awk 'NR>1 {sum +=$3}END{print sum}' 截取第三列,并且求和
=awk 'NR>1{print $3}' grade.txt |xargs|tr " " "+"|bc (tr 替换命令)
cat /etc/passwd |awk -F : 'BEGIN{num=0;print "开始统计/etc/passwd文件"}$1 ~ /feng/ || $3 > 1005 {print NR,NF,$1,length($1),$NF,$3;num++}END{print "统计结束",num}'
awk自带length()统计长度
NF表示一行有多少列,是个数字,$NF表示最后一列
awk 'BEGIN{print "阿里舅舅公司股东集资"}{sum +=$2;if( $2>=10 ) print $0}END{print "阿里舅舅公司股东集资总金额:" sum}g' alijiujiu.txt
df |awk '{print NR ,$(NF-1)}'
cat grade.txt |awk 'NR>1 && $2>=90 {print $1,$2}'
awk -F: '$3 ~ /[1-9]{4}/ {print $1,$3 } ' /etc/passwd [1-9]表示1到9的任意数字 {4}表示出现四次
awk -F: '/^[^h]/{print $1,$7}' /etc/passwd 不是h开头的
awk -F '[:/]' '{print $1,$10}' /etc/passwd 以 :/ 两个作为分割符
==精准匹配 !=不等于 用”“
~模糊匹配 用//
pattern?pattern:pattern
awk -F : '$3 ~ /\/ {print $3}' /etc/passwd $3是三个字符的符合项
||或 && 并 !否
&&优先级高于||
例子:显示用户名长度5到10的用户,并且使用shell为bash,uid大于500,并且统计这样的个数
cat /etc/passwd |awk -F: 'BEGIN{i=0}length($1)>=5&&length($1)500&& /bash$/{i++;print "username:"$1,"uid:"$3}END{print i}'
shell里的变量传递到awk内部,进行使用
1.awk -v
name=hah
echo|awk -v abc=$name '{print abc}' 变量的传递
2使用双引号 $符号需要接 \进行转义
echo |awk -F: "$1 ~ /$name/{print $1,$3}" /etc/passwd
awk用于小数运算
a=3.4 b=4.2
echo|awk "{print $a+$b}" 双引号里面可以引用
这里注意 awk里shell里的数字变量可以直接传到awk里
awk函数
system("date +%F") 获取时间
awk '{now=strftime("%D",systime());print now}' /etc/passwd
strftime("%D",.) 格式化输出
awk -F ":" 'length($2)==0{print $1,"密 码为空",strftime("%D",systime())}' /etc/shadow
awk if语句
if else 中间用;
awk '{if else if else }'