文本处理 awk

可编程-->处理灵活,功能强大

1、awk行处理方式与格式
awk也是行处理方式,但是与sed不同的是,awk可以对每行进行切片处理。

This is my cat, my cat's name is betty
This is my dog, my dog's name is frank
This is my fish, my fish's name is george
This is my goat, my goat's name is adam asd
awk -F ' ' '{print $1" : " $2}' test.log

output

This : is
This : is
This : is
This : is

  • $0表示当前行

  • $1表示每行的第一个字段

  • $2表示每行的第一个字段

  • -F ':'指定的是:未分隔符,默认是空格是分隔符

  • NR:每行的记录号

  • NF:字段数量变量

  • FILENAME: 正在处理的文件名

BEGIN 和 END

 head /etc/passwd | awk -F ':' 'BEGIN {print "用户\t目录"} {printf("%7s  %s \n", $1, $7)}'

output

用户      目录
   root  /bin/bash
    bin  /sbin/nologin
 daemon  /sbin/nologin
    adm  /sbin/nologin
     lp  /sbin/nologin
   sync  /bin/sync
shutdown  /sbin/shutdown
   halt  /sbin/halt
   mail  /sbin/nologin
operator  /sbin/nologin

awk工作流程是这样的:先执行BEGING,然后读取文件先执行BEGING,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,\(0则表示所有域,\)1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作。

ls -l | awk 'BEGIN{size=0} {print $0;size+= $5 } END{print "size is " size}'
total 280
drwxr-xr-x 3 root root   4096 May 20 21:36 IdeaProjects
drwxr-xr-x 2 root root   4096 Jun  1 00:19 logs
-rw-r--r-- 1 root root 176743 Jun  1 11:47 null
-rw-r--r-- 1 root root  73139 Jun  2 10:17 shadowsocksR.log
-rwxr-xr-x 1 root root  16220 Jun  2 10:14 shadowsocksR.sh
size is 274294

逻辑判断式

$ cat ~/.ssh/known_hosts | awk -F ' ' '$1~/^github.*/{print $1}'
github.com,13.250.177.223

~:匹配正则表达式,!~:匹配正则表达式并取反。

cat /etc/passwd |  awk -F ":"  '$1~/^root/{print $0}'
 cat /etc/passwd |  awk -F ":"  '$1 !~ /^root/{print $0}' | head  -n 4
netstat -anp  | awk '$6 ~/CONNECTED|LISTEN/ {sum[$6]++} END {for (i in sum) print i , sum[i]}'
LISTEN 7
CONNECTED 82