深入解析Linux 常用命令--awk

1.概述

awk是一个功能十分强大的文本处理命令,本文主要介绍一些常用的文本处理方法。

2.awk命令行格式

格式1: awk ‘{[pattern] action}’ filenames

格式2: awk -F #指定分割字符

格式1:

[root@smart Desktop]# cat test.log
Apr 21 15:34:49 smart user: hello
Apr 21 15:34:59 smart user: hello2
Apr 22 15:45:55 smart test1.bin: test1.c main 15 
Apr 22 15:46:08 smart test1.bin: test1.c main 15 
[root@smart Desktop]# awk '{print $5}' test.log
user:
user:
test1.bin:
test1.bin:
[root@smart Desktop]# 
[root@smart Desktop]# awk '{print}' test.log
Apr 21 15:34:49 smart user: hello
Apr 21 15:34:59 smart user: hello2
Apr 22 15:45:55 smart test1.bin: test1.c main 15 
Apr 22 15:46:08 smart test1.bin: test1.c main 15 

格式2:

[root@smart Desktop]# awk -F: '{print $1}' test.log
Apr 21 15
Apr 21 15
Apr 22 15
Apr 22 15
[root@smart Desktop]# awk -F: '{print $2}' test.log
34
34
45
46
[root@smart Desktop]# awk -F: '{print $3}' test.log
49 smart user
59 smart user
55 smart test1.bin
08 smart test1.bin
[root@smart Desktop]# 

3.awk示例

[root@smart Desktop]# cat table.txt
Index  Name       Sex     Age     Date        Location  
 1     Xiaohong   Man     10      1990/1/2    Shenzhen
 2     Xiaoming   Woman   10      1990/1/3    Shenzhen
 3     Xiaogang   Man     10      1990/1/4    Shenzhen

1)打印所有文件内容

[root@smart Desktop]# awk '{print}' table.txt
Index  Name       Sex     Age     Date        Location  
 1     Xiaohong   Man     10      1990/1/2    Shenzhen
 2     Xiaoming   Woman   10      1990/1/3    Shenzhen
 3     Xiaogang   Man     10      1990/1/4    Shenzhen

[root@smart Desktop]# awk '{print $0}' table.txt
Index  Name       Sex     Age     Date        Location  
 1     Xiaohong   Man     10      1990/1/2    Shenzhen
 2     Xiaoming   Woman   10      1990/1/3    Shenzhen
 3     Xiaogang   Man     10      1990/1/4    Shenzhen 

2)打印部分列

[root@smart Desktop]# awk '{print $1}' table.txt
Index
1
2
3
[root@smart Desktop]# awk '{print $2}' table.txt
Name
Xiaohong
Xiaoming
Xiaogang

3)模式匹配

[root@smart Desktop]# awk '/user/' test.log
Apr 21 15:34:49 smart user: hello
Apr 21 15:34:59 smart user: hello2
[root@smart Desktop]# awk '/1\/3/'  table.txt
 2     Xiaoming   Woman   10      1990/1/3    Shenzhen
[root@smart Desktop]# awk '/1\/3/  {print $2}'  table.txt
Xiaoming
[root@smart Desktop]# 

4)精确匹配

[root@smart Desktop]# awk '$2=="Xiaoming" {print}' table.txt
 2     Xiaoming   Woman   10      1990/1/3    Shenzhen

5)不匹配

[root@smart Desktop]# awk '/Xiaoming/ {print}' table.txt
 2     Xiaoming   Woman   10      1990/1/3    Shenzhen
[root@smart Desktop]# awk '!/Xiaoming/ {print}' table.txt
Index  Name       Sex     Age     Date        Location  
 1     Xiaohong   Man     10      1990/1/2    Shenzhen
 3     Xiaogang   Man     10      1990/1/4    Shenzhen

6)条件/逻辑组合

[root@smart Desktop]# awk '$1>=2 {print}' table.txt
Index  Name       Sex     Age     Date        Location  
 2     Xiaoming   Woman   10      1990/1/3    Shenzhen
 3     Xiaogang   Man     10      1990/1/4    Shenzhen
[root@smart Desktop]# awk '$1>1 && $1<3  {print}' table.txt
 2     Xiaoming   Woman   10      1990/1/3    Shenzhen
[root@smart Desktop]# awk '$2=="Xiaoming"||$2=="Xiaohong"  {print}' table.txt
 1     Xiaohong   Man     10      1990/1/2    Shenzhen
 2     Xiaoming   Woman   10      1990/1/3    Shenzhen
[root@smart Desktop]# awk '/Xiaoming|Xiaohong/ {print}' table.txt
 1     Xiaohong   Man     10      1990/1/2    Shenzhen
 2     Xiaoming   Woman   10      1990/1/3    Shenzhen
[root@smart Desktop]# 

7)内置变量

NR:已读记录数

NF:当前记录域总数

[root@smart Desktop]# awk '{print NF,NR,$0}' table.txt
6 1 Index  Name       Sex     Age     Date        Location  
6 2  1     Xiaohong   Man     10      1990/1/2    Shenzhen
6 3  2     Xiaoming   Woman   10      1990/1/3    Shenzhen
6 4  3     Xiaogang   Man     10      1990/1/4    Shenzhen
[root@smart Desktop]# awk '{print NF,$0}' table.txt
6 Index  Name       Sex     Age     Date        Location  
6  1     Xiaohong   Man     10      1990/1/2    Shenzhen
6  2     Xiaoming   Woman   10      1990/1/3    Shenzhen
6  3     Xiaogang   Man     10      1990/1/4    Shenzhen
[root@smart Desktop]# awk '{print NR,$0}' table.txt
1 Index  Name       Sex     Age     Date        Location  
2  1     Xiaohong   Man     10      1990/1/2    Shenzhen
3  2     Xiaoming   Woman   10      1990/1/3    Shenzhen
4  3     Xiaogang   Man     10      1990/1/4    Shenzhen

8)计算

[root@smart Desktop]# awk '$4=$4+4 {print $0}' table.txt
Index Name Sex 4 Date Location
1 Xiaohong Man 14 1990/1/2 Shenzhen
2 Xiaoming Woman 14 1990/1/3 Shenzhen
3 Xiaogang Man 14 1990/1/4 Shenzhen
[root@smart Desktop]# awk '{if($4!="Age") $4=$4+4}{ print $0}' table.txt
Index  Name       Sex     Age     Date        Location  
1 Xiaohong Man 14 1990/1/2 Shenzhen
2 Xiaoming Woman 14 1990/1/3 Shenzhen
3 Xiaogang Man 14 1990/1/4 Shenzhen
[root@smart Desktop]# 
[root@smart Desktop]# awk '{if($4!="Age") $4=$4+4  print $0}' table.txt
awk: {if($4!="Age") $4=$4+4  print $0}
awk:                         ^ syntax error
[root@smart Desktop]# awk '{if($4!="Age") $4=$4+4;  print $0}' table.txt
Index  Name       Sex     Age     Date        Location  
1 Xiaohong Man 14 1990/1/2 Shenzhen
2 Xiaoming Woman 14 1990/1/3 Shenzhen
3 Xiaogang Man 14 1990/1/4 Shenzhen
[root@smart Desktop]# 

9)新增输出内容

[root@smart Desktop]# awk 'BEGIN{print 1 2 3} {print $0}' table.txt
123
Index  Name       Sex     Age     Date        Location  
 1     Xiaohong   Man     10      1990/1/2    Shenzhen
 2     Xiaoming   Woman   10      1990/1/3    Shenzhen
 3     Xiaogang   Man     10      1990/1/4    Shenzhen
[root@smart Desktop]# awk 'BEGIN{print "1 2 3"} {print $0}' table.txt
1 2 3
Index  Name       Sex     Age     Date        Location  
 1     Xiaohong   Man     10      1990/1/2    Shenzhen
 2     Xiaoming   Woman   10      1990/1/3    Shenzhen
 3     Xiaogang   Man     10      1990/1/4    Shenzhen
[root@smart Desktop]# 

4.注意事项

1)双引号与单引号

特别注意awk与shell脚本中,单引号与双引号互包含的区别

[root@smart Desktop]# awk "{print}" table.txt
Index  Name       Sex     Age     Date        Location  
 1     Xiaohong   Man     10      1990/1/2    Shenzhen
 2     Xiaoming   Woman   10      1990/1/3    Shenzhen
 3     Xiaogang   Man     10      1990/1/4    Shenzhen
 [root@smart Desktop]# awk "$2=="Xiaoming" {print}" table.txt
awk: ==Xiaoming {print}
awk: ^ syntax error
[root@smart Desktop]# awk "$2=='Xiaoming' {print}" table.txt
awk: =='Xiaoming' {print}
awk: ^ syntax error
[root@smart Desktop]# 
[root@smart Desktop]# A=1
[root@smart Desktop]# B=2
[root@smart Desktop]# echo "'$A' $B"
'1' 2
[root@smart Desktop]# echo ''$A' $B'
1 $B
[root@smart Desktop]# echo '"$A" $B'
"$A" $B
[root@smart Desktop]# 

Juyin@2018/4/28,欢迎留言交流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值