linux系统中awk命令

 

1、测试数据

复制代码
[root@PC3 test]# cat a.txt
34 rtd 78
98 fgg 345
23 fgg 668
45 dfs 23
10 fsd 35
77 jla 35
87 saf 45
53 sfg 2334
46 wrt 098
复制代码

 

2、awk命令显示特定列

复制代码
[root@PC3 test]# awk '{print $1}' a.txt  ## 显示第一列
34
98
23
45
10
77
87
53
46
[root@PC3 test]# awk '{print $1,$3}' a.txt  ## 显示第一列和第三列
34 78
98 345
23 668
45 23
10 35
77 35
87 45
53 2334
46 098
[root@PC3 test]# awk '{print $0}' a.txt  ## 显示所有列
34 rtd 78
98 fgg 345
23 fgg 668
45 dfs 23
10 fsd 35
77 jla 35
87 saf 45
53 sfg 2334
46 wrt 098
复制代码

 

2、awk命令删除列

复制代码
[root@PC3 test]# cat a.txt
34 rtd 78
98 fgg 345
23 fgg 668
45 dfs 23
10 fsd 35
77 jla 35
87 saf 45
53 sfg 2334
46 wrt 098
[root@PC3 test]# awk '{$2="";print $0}' a.txt ## 删除第二列
34  78
98  345
23  668
45  23
10  35
77  35
87  45
53  2334
46  098
[root@PC3 test]# awk '{$1="";$2="";print $0}' a.txt  ## 删除第一列和第三列
  78
  345
  668
  23
  35
  35
  45
  2334
  098
复制代码

 

awk删除列不能够删除空格!将多个空格或者制表符转换为一个空格的方法:

复制代码
[root@PC3 test]# awk '{$2="";print $0}' a.txt
34  78
98  345
23  668
45  23
10  35
77  35
87  45
53  2334
46  098
[root@PC3 test]# awk '{$2="";print $0}' a.txt | sed 's/[\t ]\+/ /'  ## 将多个空格或者制表符转换为一个空格
34 78
98 345
23 668
45 23
10 35
77 35
87 45
53 2334
46 098
复制代码

 

复制代码
[root@PC3 test]# awk '{$1="";$2="";print $0}' a.txt
  78
  345
  668
  23
  35
  35
  45
  2334
  098
[root@PC3 test]# awk '{$1="";$2="";print $0}' a.txt | sed 's/^[\t ]*//g'  ## 删除行首空格
78
345
668
23
35
35
45
2334
098
复制代码

 

3、awk命令指定读取分割符

复制代码
[root@PC3 test]# cat a.txt
34_rtd_78
98_fgg_345
23_fgg_668
45_dfs_23
10_fsd_35
77_jla_35
87_saf_45
53_sfg_2334
46_wrt_098
[root@PC3 test]# awk '{print $1}' a.txt   ## awk的复制分割符为空格或者制表符,因此输出了所有的内容
34_rtd_78
98_fgg_345
23_fgg_668
45_dfs_23
10_fsd_35
77_jla_35
87_saf_45
53_sfg_2334
46_wrt_098
[root@PC3 test]# awk -F "_" '{print $1}' a.txt  ## 指定输入分割符为_.
34
98
23
45
10
77
87
53
46
[root@PC3 test]# awk -F "_" '{print $1,$2}' a.txt
34 rtd
98 fgg
23 fgg
45 dfs
10 fsd
77 jla
87 saf
53 sfg
46 wrt
复制代码

 

复制代码
[root@PC3 test]# awk 'BEGIN{FS="_"}{print $1}' a.txt   ## 利用FS指定分割符
34
98
23
45
10
77
87
53
46
[root@PC3 test]# awk 'BEGIN{FS="_"}{print $1,$2}' a.txt
34 rtd
98 fgg
23 fgg
45 dfs
10 fsd
77 jla
87 saf
53 sfg
46 wrt
复制代码

 

4、awk指定输出分割符

复制代码
[root@PC3 test]# cat a.txt
34 rtd 78
98 fgg 345
23 fgg 668
45 dfs 23
10 fsd 35
77 jla 35
87 saf 45
53 sfg 2334
46 wrt 098
[root@PC3 test]# awk '{print $1,$3}' a.txt
34 78
98 345
23 668
45 23
10 35
77 35
87 45
53 2334
46 098
[root@PC3 test]# awk '{OFS="!"}{print $1,$3}' a.txt  ## 指定输出分隔符为!
34!78
98!345
23!668
45!23
10!35
77!35
87!45
53!2334
46!098
复制代码

 

同时指定多个分隔符:

复制代码
[root@PC3 test]# cat b.txt  ## 测试数据
3_d_5_k
a 2 8 f
4:8:2:d
[root@PC3 test]# awk '{print $1,$3}' b.txt  ## awk的默认读取分隔符为空格或者制表符
3_d_5_k
a 8
4:8:2:d
[root@PC3 test]# awk -F "[_ ]" '{print $1,$3}' b.txt ## 指定分隔符为_或者空格
3 5
a 8
4:8:2:d
[root@PC3 test]# awk -F "[_ :]" '{print $1,$3}' b.txt ## 指定分割符为_或者空格或者:.
3 5
a 8
4 2
复制代码

 

 

5、awk命令打印行数

复制代码
[root@PC3 test]# awk '{print NR,$0}' a.txt
1 34 rtd 78
2 98 fgg 345
3 23 fgg 668
4 45 dfs 23
5 10 fsd 35
6 77 jla 35
7 87 saf 45
8 53 sfg 2334
9 46 wrt 098
复制代码

 

6、awk打印列数

复制代码
[root@PC3 test]# awk '{print NF}' a.txt
3
3
3
3
3
3
3
3
3
复制代码

 

7、awk打印匹配行

复制代码
[root@PC3 test]# cat a.txt
34 rtd 78
98 fgg 345
23 fgg 668
45 dfs 23
10 fsd 35
77 jla 35
87 saf 45
53 sfg 2334
46 wrt 098
[root@PC3 test]# awk '$1 ~ /45/{print $0}' a.txt  ## 打印第一列匹配45的行
45 dfs 23
[root@PC3 test]# awk '$2 ~ /fgg/{print $0}' a.txt  ## 打印第二列匹配fgg的行
98 fgg 345
23 fgg 668
[root@PC3 test]# awk '$2 ~ /fgg/ && $3 ~ /345/{print $0}' a.txt  ## 打印第二列匹配fgg,同时第三列匹配345的行
98 fgg 345
复制代码

 

8、awk依据数值大小过滤行

复制代码
[root@PC3 test]# cat a.txt
34 rtd 78
98 fgg 345
23 fgg 668
45 dfs 23
10 fsd 35
77 jla 35
87 saf 45
53 sfg 2334
46 wrt 098
[root@PC3 test]# awk '$1 > 50 {print $0}' a.txt   ## 过滤第一列大于50的行
98 fgg 345
77 jla 35
87 saf 45
53 sfg 2334
[root@PC3 test]# awk '$1 > 50 && $2 ~ /fgg/ {print $0}' a.txt  ## 同时满足两个条件
98 fgg 345
复制代码

 

而且与或者

复制代码
[root@PC3 test]# cat a.txt
34 rtd 78
98 fgg 345
23 fgg 668
45 dfs 23
10 fsd 35
77 jla 35
87 saf 45
53 sfg 2334
46 wrt 098
[root@PC3 test]# awk '$1 >= 30 && $1 <= 80 {print $0}' a.txt  ## 大于30而且小于80
34 rtd 78
45 dfs 23
77 jla 35
53 sfg 2334
46 wrt 098
[root@PC3 test]# awk '$1 <= 30 || $1 >= 80 {print $0}' a.txt  ## 小于30 或者 大于80
98 fgg 345
23 fgg 668
10 fsd 35
87 saf 45
复制代码

 

 

9、awk  if条件分支

复制代码
[root@PC3 test]# cat a.txt
34 rtd 78
98 fgg 345
23 fgg 668
45 dfs 23
10 fsd 35
77 jla 35
87 saf 45
53 sfg 2334
46 wrt 098
[root@PC3 test]# awk '{if($1 > 20){print $0}}' a.txt  ## 根据第一列进行判断
34 rtd 78
98 fgg 345
23 fgg 668
45 dfs 23
77 jla 35
87 saf 45
53 sfg 2334
46 wrt 098
[root@PC3 test]# awk '{if($1 > 20){print $0} else {print $1}}' a.txt  
34 rtd 78
98 fgg 345
23 fgg 668
45 dfs 23
10
77 jla 35
87 saf 45
53 sfg 2334
46 wrt 098
复制代码

 

复制代码
[root@PC3 test]# cat a.txt
34 rtd 78
98 fgg 345
23 fgg 668
45 dfs 23
10 fsd 35
77 jla 35
87 saf 45
53 sfg 2334
46 wrt 098
[root@PC3 test]# awk '{if($1 > 80){print $0} else if($1 > 50) {print $1,$2} else {print $1}}' a.txt
34
98 fgg 345
23
45
10
77 jla
87 saf 45
53 sfg
46
复制代码

 

10、awk输出奇数行、偶数行和整倍数行

复制代码
[root@PC3 test]# cat a.txt
1 34 rtd 78
2 98 fgg 345
3 23 fgg 668
4 45 dfs 23
5 10 fsd 35
6 77 jla 35
7 87 saf 45
8 53 sfg 2334
9 46 wrt 098
[root@PC3 test]# awk '{if(NR%2 == 0){print $0}}' a.txt  ## 取偶数行
2 98 fgg 345
4 45 dfs 23
6 77 jla 35
8 53 sfg 2334
[root@PC3 test]# awk '{if(NR%2 != 0){print $0}}' a.txt   ## 取奇数行
1 34 rtd 78
3 23 fgg 668
5 10 fsd 35
7 87 saf 45
9 46 wrt 098
[root@PC3 test]# awk '{if(NR%3 == 0){print $0}}' a.txt  ## 取3倍整数行
3 23 fgg 668
6 77 jla 35
9 46 wrt 098
复制代码

 

11、awk 列之间的四则运算

复制代码
[root@PC3 test]# cat a.txt
34 rtd 78
98 fgg 345
23 fgg 668
45 dfs 23
10 fsd 35
77 jla 35
87 saf 45
53 sfg 2334
46 wrt 098
[root@PC3 test]# awk '{print $1 + $3}' a.txt  ## 求和
112
443
691
68
45
112
132
2387
144
[root@PC3 test]# awk '{print $1 - $3}' a.txt  ## 差
-44
-247
-645
22
-25
42
42
-2281
-52
[root@PC3 test]# awk '{print $1 * $3}' a.txt  ## 积
2652
33810
15364
1035
350
2695
3915
123702
4508
[root@PC3 test]# awk '{print $1 / $3}' a.txt  ## 商
0.435897
0.284058
0.0344311
1.95652
0.285714
2.2
1.93333
0.0227078
0.469388
[root@PC3 test]# awk '{print $1 % $3}' a.txt  ##余数
34
98
23
22
10
7
42
53
46
复制代码

 

12、awk求列的和以及平均数

复制代码
[root@PC3 test]# cat a.txt
34 rtd 78
98 fgg 345
23 fgg 668
45 dfs 23
10 fsd 35
77 jla 35
87 saf 45
53 sfg 2334
46 wrt 098
[root@PC3 test]# awk '{sum += $1}END{print sum}' a.txt  ## 求第一列的和
473
[root@PC3 test]# awk '{sum += $1}END{print sum/NR}' a.txt  ## 求第一列的平均数
52.5556
复制代码

 

13、awk 引入变量值

复制代码
[root@PC3 test]# cat a.txt
34 rtd 78
98 fgg 345
23 fgg 668
45 dfs 23
10 fsd 35
77 jla 35
87 saf 45
53 sfg 2334
46 wrt 098
[root@PC3 test]# a=2
[root@PC3 test]# awk -v b=$a '{print $b}' a.txt
rtd
fgg
fgg
dfs
fsd
jla
saf
sfg
wrt
复制代码

 

14、awk 统计特定字符在一行中出现的次数

复制代码
[root@PC3 test]# cat a.txt
34 rtd 78
98 fgg 345
23 fgg 668
45 dfs 23
10 fsd 35
77 jla 35
87 saf 45
53 sfg 2334
46 wrt 098
[root@PC3 test]# awk -F "3" '{print NF-1}' a.txt  ## 统计3在每一行中出现的次数
1
1
1
1
1
1
0
3
0
复制代码

 

15、awk命令删除空行

复制代码
[root@PC3 test]# cat -A a.txt
34 rtd 78$
98 fgg 345$
23 fgg 668$
$
45 dfs 23$
10 fsd 35$
77 jla 35$
87 saf 45$
53 sfg 2334$
46 wrt 098$
[root@PC3 test]# awk NF a.txt
34 rtd 78
98 fgg 345
23 fgg 668
45 dfs 23
10 fsd 35
77 jla 35
87 saf 45
53 sfg 2334
46 wrt 098
复制代码

 

16 、awk命令忽略大小写

复制代码
[root@PC3 test]# cat a.txt
3 a d
9 k a
2 h A
c 3 k
1 z c
3 A 5
[root@PC3 test]# awk '/a/' a.txt
3 a d
9 k a
[root@PC3 test]# awk '/A/' a.txt
2 h A
3 A 5
[root@PC3 test]# awk 'BEGIN{IGNORECASE=1} /a/' a.txt
3 a d
9 k a
2 h A
3 A 5
复制代码

 

17、awk 命令大小写转换

复制代码
[root@PC3 test]# cat a.txt
3 a d
9 k a
2 h A
c 3 k
1 z c
3 A 5
[root@PC3 test]# awk '{print toupper($0)}' a.txt
3 A D
9 K A
2 H A
C 3 K
1 Z C
3 A 5
[root@PC3 test]# awk '{print tolower($0)}' a.txt
3 a d
9 k a
2 h a
c 3 k
1 z c
3 a 5
[root@PC3 test]# awk '{print toupper($2)}' a.txt
A
K
H
3
Z
A
复制代码

 

18、awk命令计算某一类文件总的大小

复制代码
[root@PC3 sheep]# ls
a.ped  result.map  result.ped  tr.map
[root@PC3 sheep]# ls -lh
total 1.1G
-rw-r--r--. 1 root root 204M Jan 30 11:33 a.ped
-rw-r--r--. 1 root root  20M Jan 14 11:33 result.map
-rw-r--r--. 1 root root 829M Jan 14 11:33 result.ped
-rw-r--r--. 1 root root 7.4M Jan 30 11:33 tr.map
[root@PC3 sheep]# ls -l *.map | awk '{sum +=$5}END{print sum/(1024*1024),"Mb"}'
26.9319 Mb
复制代码

 

19、awk命令依据行的长度进行筛选

复制代码
[root@PC3 test]# cat a.txt
3
9k
2hA
cfsd
1zc3d
3A5sdf
asfdfds
safssdff
sfafsfsfa
asfdfdfsee
[root@PC3 test]# awk 'length == 3' a.txt
2hA
[root@PC3 test]# awk 'length == 6' a.txt
3A5sdf
[root@PC3 test]# awk 'length > 6' a.txt
asfdfds
safssdff
sfafsfsfa
asfdfdfsee
[root@PC3 test]# awk 'length < 4' a.txt
3
9k
2hA
[root@PC3 test]# awk 'length > 2 && length < 6' a.txt
2hA
cfsd
1zc3d
复制代码

 

posted @   小鲨鱼2018  阅读(341)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示