目录
频道首页
📚 三剑客之AWK
收藏
0
xy20118 最近修改于 2024-05-16 14:58:15

前言

image

AWK 变成语言

AWK是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言(其名称得自于它的创始人阿尔佛雷德·艾侯、彼得·温伯格和布莱恩·柯林汉姓氏的首个字母)的最大功能取决于一个人所拥有的知识。awk经过改进生成的新的版本nawk,gawk,现在默认linux系统下日常使用的是gawk,用命令可以查看正在应用的awk的来源(ls -l /bin/awk ) -----摘自百度百科。

gawk免费 所以linux默认使用 GNU AWK 用户手册文档 https://www.gnu.org/software/gawk/manual/gawk.html

在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,默认以空格或tab键作为分隔符作为分隔,并按模式或者条件执行编辑命令。而awk比较倾向于将一行分成多个字段然后进行处理。AWK信息的读入也是逐行 指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互 的情况下实现相当复杂的文本操作,被广泛应用于 Shell 脚本,完成各种自动化配置任务。

工作原理

简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理,执行结果可以通过 print 的功能将字段数据打印显示。

语法及基本使用

语法

awk [options] 'script' file1 file2, ...
awk [options] 'PATTERN {acticon}' file1 file2, ...

1.pattern

决定动作语句何时触发及触发事件:BEGIN、END

[root@sv1 ~]# awk -F: 'BEGIN {print "hello"} {print $1}' /etc/passwd |head -n3
hello           #优先处理BEGIN指定动作 先处理hello。
root
bin

2. action

对数据进行处理,放在{}内指明:print、printf 最常用的是 print,默认以空白字符分隔

$0 代表整行,$1 代表第 1 段,$2 代表第 2 段,以此类推, $NF代表最后一个字段,多个字段直接用逗号隔开
awk '{print $1, $2}'  file

image

3.. options

参数:输入分隔符,默认以空白字符分隔 -F 选项来执行分隔符 可自定义分隔符 -v var=value 变量赋值

[root@sv1 ~]# awk -F: '{print $3,$1}' /etc/passwd

image

4.内置变量

FS:输入字段分隔符,默认空白字符,一般需要加 -F OFS:输出字段分隔符,默认是空格,一般需要加 -v NF:当前处理的行的字段个数(常用) NR:当前处理的行的行号 (常用) RS:行分隔符。awk从文件上读取资料时,将根据RS的定义就把资料切割成许多条记录,而awk一次仅读入一条记录进行处理。预设值是\n


FS

[root@sv1 ~]# awk  -v FS=':' '{print $1FS$3}' /etc/passwd
# FS相当于赋值分隔符 :  进出处理数据。

image


NF

[root@sv1 ~]# awk -F: '{print NF}' /etc/passwd
7
7
7
7
#直接使用NF 表示当前处理行的字段个数是7    
[root@sv1 ~]# awk -F: '{print $NF}' /etc/passwd
/bin/bash
/sbin/nologin
# $NF 表示最后一个字段
root@sv1 ~]# awk -F: '{print $(NF-1)}' /etc/passwd
/root
/bin
/sbin
#  $NF-1 表示倒数第二个字段

NR

root@sv1 ~]# awk -F: '{print $1,NR}' /etc/passwd
root 1
bin 2
daemon 3
adm 4
lp 5
sync 6

image

NR==n,NR==m 打印n行到m行

[root@sv1 ~]# awk 'NR==1,NR==3{print}' /etc/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

NR==n||NR==m 打印第n行 和第m行。

[root@sv1 ~]# awk 'NR==3||NR==7{print }' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

image

(NR%2)==0或者1 打印偶数行和奇数行

[root@sv1 ~]# awk '(NR%2)==1{print NR}' /etc/passwd

image 打印出普通用户

[root@sv1 ~]# awk -F: '$3>1000{print}' /etc/passwd 
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin 

5.自定义变量

-v 变量赋值 自定义变量

[root@sv1 ~]# awk -v abc='vvv' 'BEGIN{print abc}'
vvv
# -v 后 abc变量赋值vvv  打印变量名abc  
[root@sv1 ~]# awk -v a=b="666" 'BEGIN{a=b="666";print a,b}'
666 666   # 如果不在{}内部定义a=b=“666”  会默认变量a=(b=666)
[root@sv1 ~]# awk -v a=b="666" 'BEGIN{print a,b}'
b=666 

!!#ffff00 printf !!
%s:显示字符串 %d, %i:显示十进制整数 %f:显示为浮点数 %e, %E:显示科学计数法数值 %c:显示字符的ASCII码 %g, %G:以科学计数法或浮点形式显示数值 %u:无符号整数 %%:显示%自身

awk -F:   '{printf "%s",$1}' /etc/passwd
awk -F:   '{printf "%s\n",$1}' /etc/passwd
awk -F:   '{printf "%20s\n",$1}' /etc/passwd
awk -F:   '{printf "%-20s\n",$1}' /etc/passwd
awk -F:   '{printf "%-20s %10d\n",$1,$3}' /etc/passwd
awk -F:   '{printf "Username: %s\n",$1}' /etc/passwd
awk -F:   '{printf “Username: %sUID:%d\n",$1,$3}' /etc/passwd
awk -F:   '{printf "Username: %25sUID:%d\n",$1,$3}' /etc/passwd
awk -F:   '{printf "Username: %-25sUID:%d\n",$1,$3}' /etc/passwd

6.关系表达式

关系表达式结果为“真”才会被处理 真:结果为非0值,非空字符串 会进行打印 假:结果为空字符串或0值 不处理。

[root@sv1 ~]# seq 4 |awk 1   
1
2
3
4
[root@sv1 ~]# seq 4 |awk 0

打印非第一行

[root@sv1 ~]# seq 10 |awk 'n++'   # n未赋值 首先n=0  输出之后为0 假 不打印 n++ 是先处理 再+1 第二次n=1  为非0值  可以打印  以此类推  除了第一行 都显示
2
3               
4
5
6
7
8
9
10
#'!n++'  只打印第一行 

打印奇数偶数

[root@sv1 ~]# seq 10 | awk -v i="1" 'i=!i'
2
4
6
8
10
[root@sv1 ~]# seq 10 | awk -v i="0" 'i=!i'
1
3
5
7

结合正则匹配使用

匹配UID打印。

[root@sv1 ~]# awk  ' /^UUID/{print $1}' /etc/fstab 
UUID=b01d4041-8810-4654-9d25-802b3f402bd0 

打印第几行 第几列

[root@sv1 ~]#  awk -F: 'NR==3{print $1}'  /etc/passwd
daemon
[root@sv1 ~]#  awk -F: 'NR==3{print $3}'  /etc/passwd
2

打印多少行之间 并且显示行号

[root@sv1 ~]# awk 'NR>=3 && NR<=5{print NR,$0}' /etc/passwd
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
内容大纲
批注笔记
📚 三剑客之AWK
ArticleBot
z
z
z
z
主页
会议室
Git管理
文章
云文档
看板