数据处理命令
-F 定义列分隔符
awk '条件类型 1{动作 1} 条件类型2{动作 2} ...' filename
1.读入第一行,并将内容按分隔符(默认空格)分割,每个字段列可以使用$1,$2...访问。
整行使用$0
2. 依据 "条件类型" 的限制,判断是否需要迚行后面的 "动作";
3. 做完所有动作与条件判断;
4. 若还有后续的“行”数据,则重复上面 1~3 癿步骤,直到所有的数据都读完为止。
内部变量:
NF 每一行拥有的字段总数
NR 目前处理是第几行
FS 目前的分割字符,默认空格
FILENAME 文件名
BEGIN 读入之前执行
END 处理完所有读入数据后执行
> last -n5 appoper pts/18 25.0.170.121 Thu Nov 2 15:17 still logged in appoper pts/26 25.0.170.121 Thu Nov 2 15:13 - 15:19 (00:05) appoper pts/18 25.0.170.107 Thu Nov 2 15:11 - 15:16 (00:05) appoper pts/26 25.0.170.106 Thu Nov 2 15:10 - 15:11 (00:01) appoper pts/18 25.0.170.121 Thu Nov 2 15:05 - 15:10 (00:05)
> last -n5|awk '{print $1"@"$3}' [email protected] [email protected] [email protected] [email protected] [email protected]
以“:”分割,输出uid小于10的用户名
> cat /etc/passwd |awk '{FS = ":"} $3 <10 {print $1}' root:x:0:0:root:/root:/bin/bash #第一行未被分割,下面使用BEGIN处理 bin daemon adm lp sync shutdown ....
用BEGIN关键字,先执行BEGIN语句,后读取内容处理
> cat /etc/passwd |awk 'BEGIN{FS = ":"} $3 <10 {print $3 "\t" $1}' 0 root 1 bin 2 daemon 3 adm 4 lp 5 sync 6 shutdown .....
新建文本awk.txt内容:
a 10 20
b 23 34
c 12 13
统计第二列的和,END处理完所有读取行后执行
> cat awk.txt|awk -F' ' 'BEGIN{total=0}{total=total+$2;print $2}END{print total}' 10 23 12 45
统计当前目录文件大小和
> ll|awk 'BEGIN{size=0}{size=size+$5}END{print "total size:"size}' total size:7467
结合printf格式化输出使用
printf [-v var] format [arguments]
\r 回车
\n 换行
\t tab键
%ns n个长度的string
%ni n个长度的integer
%a.bf 总长为a,小数点后b个长度格式的float
> cat awk.txt |awk -F' ' '{printf "%4s%4i\t%4.2f\n",$1,$2,$3}' a 10 20.00 b 23 34.00 c 12 13.00