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}'
appoper@25.0.170.121
appoper@25.0.170.121
appoper@25.0.170.107
appoper@25.0.170.106
appoper@25.0.170.121

以“:”分割,输出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

相关推荐