当前位置:网站首页>shell之正则表达式及三剑客awk命令

shell之正则表达式及三剑客awk命令

2022-08-10 16:03:00 芒地狠

目录

一、awk介绍

1、awk常见用法

2、awk的工作原理

3、awk的格式

1、awk 包含几个特殊的内建变量

2、awk选项

二、awk的例子

1、awk按列输出   

2、awk按行输出

3、awk的内建变量使用

综合例子

总结


一、awk介绍

在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作,被广泛应用于 Shell 脚本,完成各种自动化配置任务

1、awk常见用法

通常情况下 awk 所使用的命令格式如下所示,其中,单引号加上大括号“{}”用于设置对数据进行的处理动作。awk 可以直接处理目标文件,也可以通过“-f ” 读取脚本对目标文件进行处理。

前面提到 sed 命令常用于一整行的处理,而 awk 比较倾向于将一行分成多个“字段”然后再进行处理,且默认情况下字段的分隔符为空格或者 tab 键。awk 执行结果可以通过 print 的功能将字段数据打印显示。在使用awk命令的过程中,可以使用逻辑操作符“&&”,表示“与”, “||”表示“或”,“!”表示“非”;还可以进行简单的数学运算,如+、-、*、/、%、^分别 表示加、减、乘、除、取余和乘方。

2、awk的工作原理

逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。

3、awk的格式

格式1:  awk  【选项】 '模式或条件{操作} '    文件1 文件2

格式2:  awk  -f  脚本文件   文件名

1、awk 包含几个特殊的内建变量

FS指定每行文本的字段分隔符,默认为空格或制表位(tab)
NF当前处理的行的字段个数
NR当前处理的行的行号(序数)
$0当前处理的行的整行内容
$n当前处理行的第 n 个字段(第 n 列)
FILENAME被处理的文件名
RS数据记录分隔,默认为\n,即每行为一条记录

2、awk选项

-F以XX为分隔符
-v变量赋值

二、awk的例子

1、awk按列输出   

指定分隔符 打印第1 2 3列  head /etc/passwd | awk -F: '{print $1,$2,$3}' 

指定分隔符输出第3列大于1000                       awk -F: '$3>1000' /etc/passwd

指定分隔符输出第3列<5的,且打印第1 3 列      awk -F: '$3<5{print $1,$3}' /etc/passwd

 查找本机ip                           ifconfig  ens33 | awk '/netmask/ {print $2}'

指定x为分隔符打印第1列            head /etc/passwd | awk -Fx '{print $1}' 

 

 输出时用空格隔开需要在$直接加逗号(,)       head /etc/passwd | awk -F: '{print $1,$2,$3}'

列之间插入制表符 “\t”     head /etc/passwd | awk -F: '{print $1"\t"$2"\t"$3}'

. 为分割   awk -F. '{print $2}' 3.txt

 

以多个分隔符  [ : /  ]

输出root开头的行

2、awk按行输出

awk -F: '{print $0}' 12     awk '{print}' 12  等同于cat 12

输出每行中(以空格或制表位分隔)

 输出包含root的行           awk '/root/' 12

$1与$6间隔开用,或者“ 你好 ”

3、awk的内建变量使用

NR:表示该处理的行序号是多少

NF:表示该处理的行,有多少列

NF显示每行有多少列(要指定分隔符)

NR显示行号

 

 显示行号,并显示每一行的内容

输出第一行    NR==1

输出1-3行   

输出第一行及第3行

 输出奇数行

 输出偶数行

 开头和结尾增加 BEGIN开头   END结尾

 打印最后一行  awk -F: '{print NR,$NF}' 12 | head -n5

输出倒数第2列   awk -F: '{print NR,$(NF-1)}' 12 | head -n5

输出最后一行并输出行号            awk -F: 'END{print NR,$0 }' 12

 第几行有几列             head -5 12 | awk -F[:/]  '{print "第"NR"行有"NF"列"}'

FS的使用 

OFS的使用 (定义输出以XX分割)

 第2行     第2行第1列

 多行合并为一行输出 

模糊匹配

精确匹配: 可以将要匹配的内容加上双引号

用~表示包含,用 !~ 表示不包含

 打印100个数所有能被7整除并且包含数字7的整数数字

综合例子

把名单中工号与姓名位置互换并保存到新文件中

 提取版本号

 提取已用这一列

提取ip和时间

统计/etc/fstab文件系统类型出现的次数

 提取数字

提取根分区可用量

总结

awk常用操作是提取转换文本文件内容,awk功能十分强大,几乎其它文本处理命令能做的,awk都能做。

此处主要介绍awk的几种内置变量。
$n:表示截取哪一列,通常和print一起使用
$0:表示整行内容
NF:表示该行有多少列
NR:表示该行的行号
FNR:表示读取两个文件时,序号会分别从0开始标
FS:表示读取文件的分隔符(默认空格)
OFS:表示输入的内容以什么为分割符(默认空格)
RS:表示读取文件的以什么为换行符(默认\n)
ORS:表示输出的内容以什么为换行符(默认\n)
~:表示包含
!~:表示不包含

原网站

版权声明
本文为[芒地狠]所创,转载请带上原文链接,感谢
https://blog.csdn.net/m0_71521555/article/details/126246049