awk进阶
awk的基本格式
awk [选项] '模式{动作}' 文件
模式 在处理一行之前先要判断条件
1.如果条件满足,就处理这行否则就下一行
2.如果不设置条件,则处理文件中的每一行
动作
1.模式中的条件在满足的情况,对这行内容执行的操作
选项
-F “分隔符”:用什么字符将这行内容分成一段一段
awk概念
1.基础概念
记录:一行就是一条记录
字段:一列就是一个字段
分隔符:分隔符就是将记录分割成若干个字段
2.变量
NF 表示字段数(当前这个记录中的字段的个数)
FS 表示字段分隔符(默认空格)
NR 表示记录数,在执行过程中对应于当前的行号
OFS 输出域分隔符
ORS 输出记录分隔符(默认值是一个换行符)
RS 记录分隔符(默认也是一换行符)
awk 表示每一段的方法
$1:第一个字段
$2:第二个字段
$3:第三个字段
$NF:表示每行的最后一个字段
$0:表示一整行
awk 分隔符
awk 分隔符
指定用什么来将这个记录分成一段一段的
- 数字
- 字母
- 符号
- 空格,默认是以空格为分隔符【可以省略-F】
基础 显示系统中的全部用户名
awk显示系统中的全部用户名
awk -F ":" '{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
systemd-network
.......
详细解读 awk -F ":" '{print $1}'/etc/passwd
awk 用于处理文本文件。它能够对文本进行复杂的格式处理,是Linux中功能强大的数据处理引擎之一
-F 选项用于指定输入字段的分隔符。在这个命令中,-F “:” 意味着以冒号(:)作为字段的分隔符
{print $1} 是awk的基本语法之一,表示对每一行执行的操作。在这个例子中,{print $1} 表示打印出每一行的第一个字段,即用户名
/etc/passwd 是Linux系统中的一个配置文件,存储了系统中所有用户的基本信息。每个用户的信息都以":"作为分隔符,划分为7个字段,其中包括用户名、加密密码、用户ID等
awk NR 显示系统中的前三个用户
awk显示系统中的前三个用户
awk -F ":" 'NR<=3{print $1}' /etc/passwd
root
bin
daemon
NR awk的内置变量,表示正在读取的是第几条记录
1.当读取第一行内容的时候,NR的值是1;当读取第二行的时候,NR的值是2,依次类推
2.每读取一行内容,NR的值自动加1
awk结合正则表达式
在awk中进行搜索操作
格式
awk -F ":" '/过滤的内容/{print xxx}'
awk和.*的结合使用
awk -F ":" '/r.*t/{print $0}' /etc/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
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
awk的表达式
匹配特定字符串:可以使用正则表达式来检查输入行是否包含某个特定的字符串。例如,awk ‘/smithern/’ testfile 会打印出任何包含 “smithern” 字符串的记录
模糊匹配:正则表达式支持模糊匹配,允许你指定一个模式,然后在文本中搜索所有与该模式相似的字符串。例如,awk ‘{if($3~/97/) print $0}’ 会打印出任何第三列包含数字 97 的行
提取字段:awk 允许使用正则表达式来提取文本中的字段。这对于处理复杂的文本数据非常有用。例如,你可以使用正则表达式来指定哪些字符应该被视为字段分隔符
使用内置函数:awk 提供了一些内置函数,这些函数可以与正则表达式结合使用,以执行更复杂的文本处理任务。例如,你可以使用内置函数来获取字段并应用正则表达式匹配,或者匹配并提取捕获组
过滤输出:正则表达式的一个重要用途是过滤命令或文件的输出。你可以使用正则表达式来定义一个模式,然后 awk 会根据这个模式来决定是否打印某行文本。这对于编辑文本或配置文件的一部分等操作非常有用
运算符:awk 支持正则表达式的匹配运算符(波浪线 ~),用于计算模式是否匹配。如果输入行中的某个字符串与正则表达式相匹配,则执行与该表达式关联的操作
特殊字符:正则表达式中包含多种特殊字符,如点号(.)用于匹配除换行符外的任何单个字符,加号(+)用于指定一个或多个字符或扩展正则表达式的具体值