linux中 awk命令
作用: 打印((或者格式化打印))用规则处理完的文本
概要
1 语法格式
-
awk 参数 处理规则 文件路径
-
特点
-
grep、sed和awk都是读一行处理一行
2 参数
-
-F
3 awk的底层执行流程(生命周期)
-
读一行
-
用默认或者指定分隔符分割当行文本
-
处理文本(用处理规则)
-
处理完的结果赋值给$0
-
重复一行步骤,读然后处理完所有行
-
将所有的结果数据交给END{}处理
4 awk中的预定义变量
-
$0
-
$n
-
NF
-
NR
-
FS
-
OFS
5 awk处理规则的执行流程
-
从上到下,至少有1个
-
BEGIN{}
-
正则
-
//
-
循环
-
{}
-
END{}
-
打印之前最后的处理
6 awk中的函数
-
print
-
打印
-
prinf
-
格式化打印
-
用到字符
-
%s : 字符串
-
%d :数字
-
- :左对齐
-
+ :右对齐
-
15 : 至少占用15字符
7 awk的定位
-
正则
-
比较表达式
-
逻辑表达式
-
算术表达式
-
条件表达式
-
范围表达式
8 流程控制
-
if
-
awk 加 for
-
awk 加 while
=====
操作演示
=====
-------
2 参数
-------
-F : 指定文本以xxx为分隔符(默认是以空格作为分隔符)
本语句结果: 打印以xxx为分隔符的最后一列
涉及知识点:
$非零数字: 指代第几列
NF含义:见下面
案例
分析
1 分析系统用户解析器规律
发现: 1)是每行的最后一列 2)前面是冒号
2 解答
--------------------
4 awk 中 预定义变量
--------------------
$0
代表当前行
awk '{print $0, "---"}' /etc/passwd
$n
代表第n列(n非零)
awk -F: '{print $1}' 文件路径
NF
以xxx为分隔符,统计当前行的字段数
那么$NF
$NF
NR
-
用来记录文本行号
FS
-
指定文本内容分隔符(默认是空格)
-
优先级要高于 参数-F
OFS
-
指定打印分隔符
---------------
6 awk中的函数
---------------
printf 格式化打印
-
%s : 字符串
-
%d :数字
-
- :左对齐
-
+ :右对齐
-
15 : 至少占用15字符
以xxx为分隔符,格式化打印文本内容
以冒号为指定分隔符, 格式化打印 /etc/passwd 中最后一列 第一列内容
以冒号为指定分隔符, 格式化打印 /etc/passwd 中最后一列 第一列内容
-------------
7 awk的定位
-------------
格式
-
awk -F指定的分隔符 '定位{print $0}' /etc/passwd
-
或 awk '定位{print $0}' /etc/passwd
7.1 正则定位
7.2 比较表达式(数字才能比较)
-
>
-
<
-
>=
-
<=
-
~ 包含(用于正则匹配)
-
!~ 不包含(用于正则匹配)
案例:要求打印属组ID大于属主ID的行
思路:属组 属主ID分别哪一列
案例:结尾包含bash的行打印出来
案例:结尾不包含bash的行打印出来
-
[root@localhost ~]# awk -F: '$NF !~ /bash/{print $0}' /etc/passwd
7.3 逻辑表达式
-
&& : 逻辑与
-
|| :逻辑或
-
! :逻辑非
逻辑与
逻辑或
-
[root@localhost ~]# awk -F: '$3 + $4 > 2000 || $3 * $4 > 2000{print $0}' /etc/passwd
逻辑非
7.4 算数表达式
-
+
-
-
-
*
-
/
-
%
案例 要求属组 + 属主的ID 小于 20
分析: 属组和属主所在列对应值之和小于20
$3 即取第3列对应的值
案例 要求打印偶数行
案例 要求打印奇数行
7.5 条件表达式
-
==
-
>
-
<
-
>=
-
<=
案例:要求打印第三行
7.6 范围表达式
题目: 打印前3行
-----------
8 流程控制(仅用于循环中)
-----------
if
-
if(){} 单分支
-
if(){}else{} 双分支
-
if(){}else if(){}else{} 多分支
for
格式
for(i="初始值";条件判断;游标){}
while
-
格式
-
i="初始值";while(条件判断){执行语句 ;i++}
案例1
将文件打印两边
案例2
每隔2行打印在下一行打印一行斜线