shell脚本工具之awk命令

简介:

    awk是一种优良的文本处理工具.可以对文件中的内容一行一行提取并处理,也可将文件分列的形式提取.

 

awk内置变量:

$0                --输出文件所有内容

$1-$n             --以分隔符输出每列的值

FILENAME          --输出文件名

FS                --输出字段的分隔符

NF                --当前记录的字段数目

NR                --当前记录的编号

OFS               --输出字段的分隔符

ORS               --输出记录分隔符

RS                --控制记录分隔符

 

文件内容:

[root@tong1 opt]# cat passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@tong1 opt]#

 

1.awk命令格式

awk '{pattern + action}' {filenames}

 

2.内置变量实例

[root@tong1 opt]# awk -F: '{print "第一列值:"$1,"文件名:"FILENAME,"每列共多少字段:"NF,"输出每行编号:",NR,"输出字段分隔符:"OFS}' passwd
第一列值:root 文件名:passwd 每列共多少字段:7 输出每行编号: 1 输出字段分隔符: 
第一列值:bin 文件名:passwd 每列共多少字段:7 输出每行编号: 2 输出字段分隔符: 
第一列值:daemon 文件名:passwd 每列共多少字段:7 输出每行编号: 3 输出字段分隔符: 
第一列值:adm 文件名:passwd 每列共多少字段:7 输出每行编号: 4 输出字段分隔符: 
第一列值:lp 文件名:passwd 每列共多少字段:7 输出每行编号: 5 输出字段分隔符: 
第一列值:sync 文件名:passwd 每列共多少字段:7 输出每行编号: 6 输出字段分隔符: 
第一列值:shutdown 文件名:passwd 每列共多少字段:7 输出每行编号: 7 输出字段分隔符: 
第一列值:halt 文件名:passwd 每列共多少字段:7 输出每行编号: 8 输出字段分隔符: 
第一列值:mail 文件名:passwd 每列共多少字段:7 输出每行编号: 9 输出字段分隔符: 
第一列值:uucp 文件名:passwd 每列共多少字段:7 输出每行编号: 10 输出字段分隔符: 
第一列值:operator 文件名:passwd 每列共多少字段:7 输出每行编号: 11 输出字段分隔符: 
第一列值:games 文件名:passwd 每列共多少字段:7 输出每行编号: 12 输出字段分隔符: 
第一列值:gopher 文件名:passwd 每列共多少字段:7 输出每行编号: 13 输出字段分隔符: 
第一列值:ftp 文件名:passwd 每列共多少字段:7 输出每行编号: 14 输出字段分隔符: 
[root@tong1 opt]#

 

3.用printf输出格式

[root@tong1 opt]# awk -F: '{printf ("第一列值:%-10s,文件名:%-10s,每列共多少字段:%-3s,输出每行编号:%-3s,输出字段分隔符:%10s\n",$1,FILENAME,NF,NR,OFS)}' passwd
第一列值:root      ,文件名:passwd    ,每列共多少字段:7  ,输出每行编号:1  ,输出字段分隔符:          
第一列值:bin       ,文件名:passwd    ,每列共多少字段:7  ,输出每行编号:2  ,输出字段分隔符:          
第一列值:daemon    ,文件名:passwd    ,每列共多少字段:7  ,输出每行编号:3  ,输出字段分隔符:          
第一列值:adm       ,文件名:passwd    ,每列共多少字段:7  ,输出每行编号:4  ,输出字段分隔符:          
第一列值:lp        ,文件名:passwd    ,每列共多少字段:7  ,输出每行编号:5  ,输出字段分隔符:          
第一列值:sync      ,文件名:passwd    ,每列共多少字段:7  ,输出每行编号:6  ,输出字段分隔符:          
第一列值:shutdown  ,文件名:passwd    ,每列共多少字段:7  ,输出每行编号:7  ,输出字段分隔符:          
第一列值:halt      ,文件名:passwd    ,每列共多少字段:7  ,输出每行编号:8  ,输出字段分隔符:          
第一列值:mail      ,文件名:passwd    ,每列共多少字段:7  ,输出每行编号:9  ,输出字段分隔符:          
第一列值:uucp      ,文件名:passwd    ,每列共多少字段:7  ,输出每行编号:10 ,输出字段分隔符:          
第一列值:operator  ,文件名:passwd    ,每列共多少字段:7  ,输出每行编号:11 ,输出字段分隔符:          
第一列值:games     ,文件名:passwd    ,每列共多少字段:7  ,输出每行编号:12 ,输出字段分隔符:          
第一列值:gopher    ,文件名:passwd    ,每列共多少字段:7  ,输出每行编号:13 ,输出字段分隔符:          
第一列值:ftp       ,文件名:passwd    ,每列共多少字段:7  ,输出每行编号:14 ,输出字段分隔符:          
[root@tong1 opt]#

 

4.打印特殊字符

[root@tong1 opt]# awk 'BEGIN {print "dsvjs"}'
dsvjs
[root@tong1 opt]# awk 'BEGIN {print "\"dsvjs\""}'     --打印"号
"dsvjs"
[root@tong1 opt]#

 

5.动态读入内容

[root@tong1 opt]# awk '{print}'
qw er haogv 3
qw er haogv 3
3 677
3 677
^C
[root@tong1 opt]#

 

6.查找文件内容并输出

[root@tong1 opt]# awk '/mail/ {print $0}' passwd
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

[root@tong1 opt]# awk '/root/ {print $0};/ftp/ {print $0}' passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@tong1 opt]#

 

7.在文件中查找第三列的值大于10输出

[root@tong1 opt]# awk -F":" '{ if ($3 > 10) print $1}' passwd
operator
games
gopher
ftp
[root@tong1 opt]#

 

8.输出文件第10行以后的数据

[root@tong1 opt]# awk 'NR>10' passwd
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@tong1 opt]#

 

正则表达式

^         --以某字符开头

~         --等于某字符

\         --转义特殊字符

$         --以某字符结尾

.         --任意一个字符

[...]     --匹配方括号任意字符

[^..]     --不匹配方括号任意字符

|         --或

*         --所有字符

+         --连续字符

?         --单个字符

{n}       --字符出现n次

{n,}      --字符出现n次以上

{n,m}     --字符出现n到m次之间


9.使用正则表达式

[root@tong1 opt]# awk '$1 ~ /root/ {print}' passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@tong1 opt]# 


10.以r开头,中断只有两个字符的内容

[root@tong1 opt]# awk '$1 ~ /^r..t/ {print}' passwd
root:x:0:0:root:/root:/bin/bash
[root@tong1 opt]# 


11.计算$3的值,符合条件输出(OFS  指定输出格式)

[root@tong1 opt]# awk -F: 'BEGIN {OFS=":"};{$3=$3-5;if($3>3) print $1,NR}' passwd
uucp:10
operator:11
games:12
gopher:13
ftp:14
[root@tong1 opt]# 

12.统计文件中的内容

[root@tong1 opt]# cat 4.sh 
$1 ~ /^root/ 
BEGIN {
   FS=":";OFS=""
}

{
   for (i=0;i<NF;i++) {
       print "用户名:",$1
       print "密码:",$2
       print "UID:",$3
       print "GID",$4
   }
}
END{}
[root@tong1 opt]# awk -f 4.sh  passwd


13.提取内容写入到新文件中

[root@tong1 opt]# awk -F: '{print $1 > "1.txt"} {print $4 > "2.txt"}' passwd
[root@tong1 opt]# cat 1.txt 
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
uucp
operator
games
gopher
ftp
[root@tong1 opt]# cat 2.txt 
0
1
2
4
7
0
0
0
12
14
0
100
30
50
[root@tong1 opt]# 










本文转自 z597011036 51CTO博客,原文链接:http://blog.51cto.com/tongcheng/1623289,如需转载请自行联系原作者
目录
相关文章
|
6天前
|
Shell
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
28 1
|
11天前
|
Web App开发 网络协议 Linux
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
这篇文章是关于Linux命令的总结,涵盖了从基础操作到网络配置等多个方面的命令及其使用方法。
35 1
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
|
14天前
|
Shell 知识图谱
Shell printf 命令
10月更文挑战第3天
12 1
|
25天前
|
监控 Unix Shell
shell脚本编程学习
【10月更文挑战第1天】shell脚本编程
51 12
|
25天前
|
Unix Shell Linux
常见的shell命令
shell常用命令
27 11
|
21天前
|
存储 运维 监控
自动化运维:使用Shell脚本简化日常任务
【9月更文挑战第35天】在IT运维的日常工作中,重复性的任务往往消耗大量的时间。本文将介绍如何通过编写简单的Shell脚本来自动化这些日常任务,从而提升效率。我们将一起探索Shell脚本的基础语法,并通过实际案例展示如何应用这些知识来创建有用的自动化工具。无论你是新手还是有一定经验的运维人员,这篇文章都会为你提供新的视角和技巧,让你的工作更加轻松。
23 2
|
14天前
|
Shell PHP
Shell echo命令
10月更文挑战第3天
12 0
|
15天前
|
存储 Shell Linux
【Linux】shell基础,shell脚本
Shell脚本是Linux系统管理和自动化任务的重要工具,掌握其基础及进阶用法能显著提升工作效率。从简单的命令序列到复杂的逻辑控制和功能封装,Shell脚本展现了强大的灵活性和实用性。不断实践和探索,将使您更加熟练地运用Shell脚本解决各种实际问题
12 0
|
18天前
|
JSON Java Shell
Dockerfile中RUN、CMD、ENTRYPOINT、SHELL命令的区别
理解这些指令的差异和应用场景,有助于构建高效、灵活且易于管理的Docker镜像。在实际应用中,根据需要选择合适的指令,可以有效地控制镜像构建和容器运行的行为。
30 0
|
23天前
|
SQL Shell 数据库
在TDengine容器中创建初始化数据库的Shell命令实例
以上就是在Docker容器环境中部署并初始化TDengine数据库的全过程,希望对你有所帮助。
24 0