linux awk 命令

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内容:
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

猜你喜欢

转载自nullpoint.iteye.com/blog/2398468