tycoon 2017-11-02
awk
数据处理命令
-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内容:
a1020
b2334
c1213
统计第二列的和,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[-vvar]format[arguments]
\r回车
\n换行
\ttab键
%nsn个长度的string
%nin个长度的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