Hi,阿金 ...

Linux三剑客之awk

发表: 2019-04-20 分类:

Linux三剑客:awk,sed,grep
如果你不会这三个命令,就别谈会Linux.
awk,sed都是linux下处理文本和文件的命令.还有一本书专讲这两个命令.《sed 与 awk》《awk》
基本上每个linux系统下都自带这三命令.

Linux之 awk 命令

awk是处理文本文件的一个应用程序,实际上awk还是一门脚本语言,但我们平时只用到awk命令.
awk的处理逻辑是依次扫描处理文本文件的每一行,每一列(字段).
我们经常使用它来处理大量的日志文件,csv文件.
下面只讲,命令方法.
假如我们有这样一段csv文件.会员列表吧.
[user.csv]

1
2
3
4
5
1001,阿金,13800013801,user001@163.com
1002,阿木,13800013802,user002@163.com
1003,阿水,13800013803,user003@163.com
1004,阿火,13800013804,user004@163.com
1005,阿土,13800013805,user004@163.com

基本语法:

1
awk 参数 动作 文件名

逐行打印

1
awk '{print}' user.csv

解释:
{print} 为动作 print命令 为打印显示
print命令默认尾部会加换行.
可以使用printf 命令不会加换行.

显示指定列

如:姓名,手机号

1
awk -F ',' '{print $2,$3}' user.csv

效果如下:

解释:
‘-F’: 代表 列(字段)分割符,默认使用空白符 (空格或Tab)
‘\$2’: 表示 第2个字段,即是第2列
‘\$3’: 表示 第3个字段
$0:表示整行.
‘,’: 逗号表示,空格
除了这些,还有很多内置的变量,和方法,参考awk官方文档.
如:NR代表行号.

1
awk -F ',' '{print NR".手机号是:"$3}' user.csv


双引号是字符串.

这样就可以生成,一些脚本,如PHP,bash批量发送短信脚本.

变量和运算

awk可以用变量和运算结果
echo "" | awk '{a=1+2;print a;}'
解释:
awk脚本使用 ;作来代码分隔符.

处理函数

内置很多处理函数,如大小写转换,切割截取文本,正则,数学处理,随机数等等.
详细参考官方文档.
《内置函数文档》

如把substr(string,start,length)注意字符集,中文utf8按3个字节.

1
awk -F ',' '{print substr($2,4,3)}'  user.csv

条件输出

基础语法,动作为空时,默认print输出
awk '条件语句 {动作}'
比如第1表用户ID,大于1002的

1
awk -F ',' '$1>1002 && $1<1005'  user.csv


说明:
条件符如: <,>,=,>=,<=,!不等于,&&合,|| 或等.
例:从第2行开始

1
awk -F ',' 'NR>1 {print $2,$3}'  user.csv

也可以支持正则.
例,查找包含”阿金”的行:

1
awk -F ',' '/阿金/ {print $2,$3}'  user.csv

IF语句

复杂的条件,可以使用if条件.
可以使用if() ;else
例:只输出偶数行.

1
awk -F ',' '{if($1%2 ==0)print $2;}'  user.csv

例:使用else if ,else

1
awk -F ',' '{if($1%2 ==0)print $2;else if($1==1001) print "第1行";else print "--"}'

BEGIN和END

基本语法
BEGIN{读取前前执行} 条件 {动作} END{最后退出前}
可以单独使用,注意大写.
例,BEGIN

1
awk -F ',' 'BEGIN {print "我们要开始遍历行了:"} {print $0}' user.csv

例:END
一般用于统计结果,如求ID的总和.

稍微复杂的经典案例:
计算目录下的文本总大小.
需要个知识:
ls -l 目录 : 显示目录的文件列表
|: 管道符,把前面的结果传给后面命令
例:计算当前目录下,.gz文件的总大小

1
ls -l ./ | awk '/.gz$/ {size+=$5} END {print "大小为:" size}'

PS,查看文件和目录大小有专用的命令.
du -sk 目录或文件

du -skh ./*.gz
h:友好显示大小
k: Kb
m: Mb

上面求大小可以改成.

1
du -sk ./*.gz | awk '{size+=$1;} END{print size}'

独立脚本运行

awk是一个脚本语言,类似python,JS一样.
由于是很多linux系统自带,所以流行度很高.
脚本演示.

awk -f 脚本 处理文件

1
awk -f user.awk user.csv

例: 处理成json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/awk 
BEGIN{
FS=",";
RS="\r"#MacOs 是'\r'
print "{" > "user.json"
}
{
obj="{"
obj=obj"\id\":\""$1"\",";
obj=obj"\"name\":\""$2"\",";
obj=obj"\"phone\":\""$3"\",";
obj=obj"\"email\":\""$4"\",";
obj=obj"},"
print obj >> "user.json"
}
END{
print "}" >> "user.json";
}

解释:
FS : 修改字段分隔符
RS : 修改行分隔符,默认\n
>> : 重定向到文件

本文作者:阿金

本文链接:http://www.hi-arkin.com/2019/04/20/Linux/awk/

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

扫描二维码,分享此文章