Linux三剑客命令——啊
一、概念说明
官方概念描述:
呆呆模式扫描和处理语言
模式扫描和处理文件语言
AWK是一种处理文本文件的语言,主要用于格式化文本,是一种强大的文本分析工具。
之所以叫AWK,是因为它采用了三位创始人——阿尔弗雷德艾侯、彼得温伯格和布莱恩克尼根的姓氏首字母。
二、awk功能应用说明
处理文件信息
文本文件信息
日志文件信息
档案信息
文件的处理
排除信息
查询信息
统计信息
替换信息
三、awk语法原理
3.1 命令语法格式
标准格式:
awk[选项]“模式{操作}”[文件信息]
awk[参数][处理规则][操作对象]
参数:
-F :指定文本分隔符(默认为空格作为分隔符)
适用于打印系统所有用户的解析器
awk-f :“{ print $ NF }”/etc/passwd
模式描述(匹配信息):
正常模式(定位)
正则表达式模式
Eg:从根开始打印行
[root @ localhost ~]# awk-f : '/^root/{print $ 0 } '/etc/passwd
比较表达式模式
相关符号:
=
=
~:常规匹配
!~:常规匹配(反转)
要求打印组标识大于所有者标识的行。
[root @ localhost ~]# awk-f : ' $ 4 $ 3 { print $ 0 } '/etc/passwd
结尾包含bash。
[root @ localhost ~]# awk-f : ' $ NF ~/bash/{ print $ 0 } '/etc/passwd
结尾不包含bash。
[root @ localhost ~]# awk-f : ' $ NF!~ /bash/{print $0}' /etc/passwd
逻辑表达模式
相关符号:
3360逻辑和
|||:逻辑或
!逻辑否定
属群所有者的ID大于2000,属群所有者的ID *大于2000。
[root @ localhost ~]# awk-f : ' $ 3 $ 4 2000 $ 3 * $ 4 2000 { print $ 0 } '/etc/passwd
属组所有者的标识需要大于2000或者属组所有者的标识*需要大于2000。
[root @ localhost ~]# awk-f : ' $ 3 $ 4 2000 | | $ 3 * $ 4 2000 { print $ 0 } '/etc/passwd
组所有者的标识不超过2000(小于或等于2000)。
[root@localhost ~]# awk -F: '!($3 $4 2000){print $0}' /etc/passwd
算术表达式模式
相关符号:
-
*
/
%
该组所有者的标识必须大于2000。
[root @ localhost ~]# awk-f : ' $ 3 $ 4 2000 { print $ 0 } '/etc/passwd
组*所有者的标识必须大于2000。
[root @ localhost ~]# awk-f : ' $ 3 * $ 4 2000 { print $ 0 } '/etc/passwd
要求打印偶数行。
[root @ localhost ~]# awk-f : ' NR % 2==0 { print $ 0 } '/etc/passwd
需要打印奇数行。
[root @ localhost ~]# awk-f : ' NR % 2==1 { print $ 0 } '/etc/passwd
条件表达式模式
相关符号:
==
=
=
第三行需要打印。
[root @ localhost ~]# awk-f : ' NR==3 { print $ 0 } '/etc/passwd
范围表达式模式
eg:打印以root开头到以ftp开头的行
[root@localhost ~]# awk -F: '/^root/,/^ftp/{print $0}' /etc/passwd
特殊模式
-
BEGIN{}
概念说明:括号里面的内容会在awk读取文件之前执行
awk 'BEGIN{print "oldboy"}{print $0}' reg.txt
作用说明:
用于测试 用于计算 修改内置变量
-
END{}
概念说明:括号里面的内容会在awk读取文件之后执行
awk '{print $0}END{print "end of file"}' reg.txt
作用说明:
显示计算最终结果 用于计算
内置变量
$0 : 代表当前行
[root@localhost ~]# awk -F: '{print $0, "---"}' /etc/passwd
$n :代表第n列
[root@localhost ~]# awk -F: '{print $1}' /etc/passwd
NF :记录当前行的字段数(表示每一行有多少列)
[root@localhost ~]# awk -F: '{print NF}' /etc/passwd
[root@localhost ~]# awk -F: '{print $NF}' /etc/passwd
NR :用来表示行号信息
[root@localhost ~]# awk -F: '{print NR}' /etc/passwd
FS :指定文本内容分隔符(默认是空格)
[root@localhost ~]# awk 'BEGIN{FS=":"}{print $NF, $1}' /etc/passwd
OFS :指定打印分隔符(默认空格)
[root@localhost ~]# awk -F: 'BEGIN{OFS=" "}{print $NF, $1}' /etc/passwd
FS 的优先级要高于 -F:-F ":" ==BEGIN{FS=":"} == -vFS=":"
3.2 命令执行过程
grep、sed和awk都是读一行处理一行,直至处理完成。
awk的生命周期如下:
- 接收一行作为输入;
- 把刚刚读入进来得到的文本进行分解;
- 使用处理规则处理文本;
- 输入一行,赋值给$0,直至处理完成;
- 把处理完成之后的所有的数据交给END{}来再次处理;
四、awk实践操作
4.1 实践环境创建
cat ./reg.txtEOF
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
EOF
4.2 命令操作实践
-
查询实践
查找实践参数:
指定列的分隔符号(参数): -F "" 显示指定行号信息(模式): NR== 显示指定列的信息(动作): print
案例说明:
按行查找文件数据信息: awk 'NR==1' reg.txt awk '/250/' reg.txt 按行按列查找文件信息: awk -F':' 'NR==1{print $1}' reg.txt awk -F':' 'NR==1{print $1,$2}' reg.txt awk -F':' '$3~/0+/' reg.txt
~ 在awk中表示匹配或者包含什么信息;
!~ 在awk中表示不匹配或者不包含什么信息;
-
查询测验(显示指定行的指定列的信息)
-
显示xiaoyu的姓氏和ID号码
条件是什么: 找出第二列包含xiaoyu的信息 动作是什么: 显示xiaoyu这行指定列信息 实践操作: awk '$2~/Xiaoyu/{print $1,$3}' reg.txt
-
姓氏是zhang的人,显示他的第二次捐款金额及他的名字
条件是什么: 找出第一列包含zhang的信息 动作是什么: 显示zhang这行指定列信息 实践操作: awk -F '[ :]+' '$1~/Zhang/{print $1 $2,$5}' reg.txt awk -F '[ :]+' '$1~/Zhang/{print $1 $2,$(NF-1)}' reg.txt
-
显示所有以41开头的ID号码的人的全名和ID号码
条件是什么: 显示以41开头的ID号 动作是什么: 显示41开头号码,人的全名的对应列 实践操作: awk '$3~/^41/{print $1 $2,$3}' reg.txt
-
显示所有ID号码最后一位数字是1或5的人的全名
条件是什么: 以1或5结尾的ID号码 动作是什么: 显示人的全名对应列 实践操作: awk '$3~/[15]$/{print $1 $2}' reg.txt awk '$3~/(1|5)$/{print $1 $2}' reg.txt awk '$3~/1$|5$/{print $1 $2}' reg.txt
-
显示Xiaoyu的捐款信息,并以$开头, 如:$110$220$330
条件是什么: 找出xiaoyu的信息 动作是什么: 显示捐款信息,在数值前赋予$ 实践操作: awk '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $0}' reg.txt
gsub 是一个函数。
-
-
特殊模式应用案例
-
统计/etc/services文件中空行数量
grep应用: grep '^$' /etc/services|wc -l grep -c '^$' /etc/services awk应用: awk '/^$/{i++}END{print i}' /etc/services (表示前面先计算,最后通过END将结果进行显示)
-
统计/etc/passwd文件中有多少个虚拟用户
awk '/nologin$/{i++}END{print i}' /etc/passwd
-
统计文件中的数值的和
seq 10|awk '{sum=sum+$0}END{print sum}'
-
五、awk相关扩展
4.1 awk中的函数
print : 打印
printf :格式化打印
%s : 字符串
%d :数字
- :左对齐
+ :右对齐
15(任意数字) : 至少占用15字符
eg:
[root@localhost ~]# awk -F: 'BEGIN{OFS=" | "}{printf "|%-15s|%-15s|\n", $NF,$1}' /etc/passwd
4.2 awk中的流程控制(只存在循环之中)
if:
if(){}
if(){}else{}
if(){}else if(){}else{}
eg:
[root@localhost ~]# awk -F: '{if($3$4){print "大于"}else{print "小于或等于"}}' /etc/passwd
for:
for(i="初始值";条件判断;游标){}
eg:
[root@localhost ~]# awk -F: '{for(i=10;i0;i--){print $0}}' /etc/passwd
while:
while(条件判断){}
eg:
[root@localhost ~]# awk -F: '{i=1; while(i10){print $0, i++}}' /etc/passwd
4.3 awk数组详述
-
数组知识学习准备
统计计算方法说明:
i=i+1 : 先计算右边,将右边数值给左边变量 i=0 i=0+1 i=1+1 (统计次数) eg: awk '/^$/{i=i+1;print i}' /etc/services awk '/^$/{i++;print i}' /etc/services i=i+$0 : 表示对每行的数字进行累加求和运算 i=0 i=0+$0 i=$0(上一行)+$0(当前行) (求和运算) eg: seq 10|awk '{sum=sum+$n;print $n,sum}'
-
数组概念知识说明
数组形式说明:
hotel[110]="张三" : hotel 数组名称 [110] 数组元素 "张三" 元素内容
数组实际应用:
awk 'BEGIN{h[110]="UFO";h[114]="XO";print h[110],h[114]}' ...
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/155870.html