awk简明用法

这几天在写数据库脚本,需要频繁的处理字符文件,笔者之前都是用java程序处理字符文件,结果看到同事用awk几秒钟就搞定了一个处理,觉得太牛逼了,于是花时间学习了下。

本文旨在帮助awk新手快速熟悉awk的常见用法,笔者会尽量把文章写得像清纯的女神一样撩起你的兴趣,不过最终还得你花力气自己撸。

首先,我们使用netstat的输出作为源文件:

netstat -ano >> netstat.txt

我们发现netstat.txt中的信息太乱了,我们仅仅需要首列是tcp的行,当然第二行的标签也需要保留:

cat netstat.txt | awk '$1=="tcp" || NR==2 {print $0}' >> netstat1.txt

netstat1.txt文件还算干净,我们需要第六列匹配"LISTEN"的行,并格式化输出(awk的格式化输出和C语言相同):

cat netstat1.txt | awk '$6 ~ /LISTEN/ || NR==1 {print $0}' >> netstat2.txt

对于netstat2.txt文件,仅仅需要它的第1,4,6列,并格式化输出(awk的格式化输出和C语言相同):

cat netstat2.txt | awk '{printf "%5s %20s %10s\n",$1,$4,$6}' >> netstat3.txt

对于netstat3,.txt,不需要Local列的端口号:

cat netstat3.txt | awk '{print $1,$3,$2}' | awk -F ':' '{print $1}' >> netstat4.txt

把netstat4.txt按照第3列的内容拆分成多个文件:

cat netstat4.txt | awk '{print > $3}'

下面进行一些补充:

~表示匹配模式
!~表示不匹配模式
/***/中夹着的是模式内容
$0	整行内容
$1~$n	当前行的第n个字段,字段间由FS分隔
FS	输入字段分隔符 默认是空格或Tab
NF	当前记录中的列的数量
NR	行号,从1开始,如果有多个文件话,这个值也是不断累加中。
FNR	行号,从1开始,与NR不同的是,这个值会是各个文件自己的行号
RS	输入的记录分隔符, 默认为换行符
OFS	输出字段分隔符, 默认也是空格
ORS	输出的记录分隔符,默认为换行符
FILENAME	当前输入文件的名字

对于文件test.txt

Marry,2143,78,84,77
Jack,2321,66,78,45
Tom,2122,48,77,71
Mike,2537,87,97,95
Bob,2415,40,57,62

使用分隔符获取第一列,并指定输出分隔符

cat test.txt | awk -F ',' '{print $1,$2}' OFS='----' >> test1.txt

对于test.txt,写一个awk脚本来处理它:

$ cat cal.awk
#!/bin/awk -f
#运行前
BEGIN {
    math = 0
    english = 0
    computer = 0
 
    printf "NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL\n"
    printf "---------------------------------------------\n"
}
#运行中
{
    math+=$3
    english+=$4
    computer+=$5
    printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5
}
#运行后
END {
    printf "---------------------------------------------\n"
    printf "  TOTAL:%10d %8d %8d \n", math, english, computer
    printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR
}

结果如下:

$ awk -f cal.awk score.txt
NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL
---------------------------------------------
Marry  2143     78       84       77      239
Jack   2321     66       78       45      189
Tom    2122     48       77       71      196
Mike   2537     87       97       95      279
Bob    2415     40       57       62      159
---------------------------------------------
  TOTAL:       319      393      350
AVERAGE:     63.80    78.60    70.00

怎么样,爽了吗!

相关推荐