linux awk

引用:http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html

awk [-F ':' ]  '{print $1}'  filename
cat filename | awk [-F ':' ]  '{print $1}'
[root@local yang]# tail /etc/passwd |awk -F ':' 'BRGIN {print "name,shell"} {print $1"---"$7} END {print "nameEND,shellEND"}'
ntp---/sbin/nologin
apache---/sbin/nologin
saslauth---/sbin/nologin
postfix---/sbin/nologin
pulse---/sbin/nologin
nameEND,shellEND

搜索并打印所在行

[root@local yang]# awk -F: '/root/' /etc/passwd #红色部分为正则
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

$0变量是指整条记录。$1表示当前行的第一个域,$2表示当前行的第二个域,......以此类推

搜索并打印所在行(过滤输出)

[root@local yang]# awk -F: '/root/{print $1}' /etc/passwd
root
operator
``

ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名(输入是文件的时候才会有文件名 如果是搜索别的命令的输出 则不会有文件名)
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行 -F选项
NF 浏览记录的域的个数(列)
NR 已读的记录数(行)
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符


变量输出示例

[root@local yang]# awk -F: '{print "filename:"FILENAME " no:"NR " cols:"NF}' /etc/passwd
filename:/etc/passwd no:1 cols:7
filename:/etc/passwd no:2 cols:7
......

使用printf

[root@local yang]# awk -F: '{printf("filename:%s no:%s cols:%s %s ",FILENAME,NR,NF,$0)}' /etc/passwd
filename:/etc/passwd no:1 cols:7 root❌0:0:root:/root:/bin/bash
filename:/etc/passwd no:2 cols:7 bin❌1:1:bin:/bin:/sbin/nologin
filename:/etc/passwd no:3 cols:7 daemon❌2:2:daemon:/sbin:/sbin/nologin
filename:/etc/passwd no:4 cols:7 adm❌3:4:adm:/var/adm:/sbin/nologin
filename:/etc/passwd no:5 cols:7 lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
filename:/etc/passwd no:6 cols:7 sync❌5:0:sync:/sbin:/bin/sync
filename:/etc/passwd no:7 cols:7 shutdown❌6:0:shutdown:/sbin:/sbin/shutdown
......


awk编程

变量示例

[root@local yang]# awk -F: '{cnt++;print cnt,$1}END{print"cnt:"cnt}' /etc/passwd
1 root
2 bin
3 daemon
7 shutdown
......
......
35 www
36 mysql
cnt:36

统计文件夹下文件占用字节数(不含子文件夹)

[root@local yang]# ll| awk 'BEGIN {size=0}{size=size+$5}END{print"total size:"size}'
total size:126062


以M计算

[root@local yang]# ll| awk 'BEGIN {size=0}{size=size+$5}END{print"total size:"size/1024/1024"M"}'
total size:126062

循环

[root@local node_modules]# awk -F ':' 'BEGIN {count=1;} {name[count] = $1;count++;}; END{for (i = 1; i < NR+1; i++) print i, name[i]}' /etc/passwd
1 root
2 bin
......

awk分割大文件并

awk 'NR%12==1{close(p".txt");++p}{print > p".txt"}' filename

原文地址:https://www.cnblogs.com/ningmo/p/5921781.html