ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

linux中awk命令详解(最全面秒懂)

2022-05-19 21:35:38  阅读:311  来源: 互联网

标签:passwd 分隔符 NF etc 详解 awk linux print


一:linux中awk命令

1.awk命令简介
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。
之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符
linux中有三剑客之称:
三剑客之首就是 AWK
三剑客功能:
grep : 过滤文本
sed  :  修改文本
awk  :  处理文本

image

2.awk作用
awk主要是用来格式化
3.awk的语法格式
	awk [参数] [处理内容] [操作对象]

4.解析awk使用方法
print	: 打印
NF		: 统计总字段数
$		: 取值
结合作用:
	$配合NF使用 : NF内存储统计文件内每行的总字段,$存储NF内的值
	NF	:相当于 变量值	$	:相当于 变量名
	print相当于打印 $ 内的内容

image

image

5.参数
	-F : 指定文本分隔符 (本身默认是以空格作为分隔符)

实战案例:
awd -F'f' '{print $NF}' 1.txt

解析:
-F'f' : 指定f为分隔符

6.awk的生命周期
grep,sed和awk都是读一行处理一行,直到处理完成。
  1. 接收一行作为输入
  2. 把刚刚读入进来得到文本进行分解
  3. 使用处理规则处理文本
  4. 输入一行,赋值给$0,直至处理完成
  5. 把处理完成之后的所有数据交给END{}来再次处理

二:awk中的预定义变量

$0	: 代表当前行(相当于匹配所有)
	awk -F: '{print $0, "---"}' /etc/passwd

$n : 代表第n列
案例1:(以:为分隔符)
awk -F: '{print $1}' /etc/passwd
案例2:(默认空格为分隔符)
awk '{print $1}' /etc/passwd

NF : 记录当前统计总字段数
案例1:(以:为分隔符 统计文件内每行内的行数)
awk -F: '{print NF}' /etc/passwd
案例2:(以:为分隔符 统计文件内每行总字段 并打印每行统计行数)
awk -F: '{print $NF}' /etc/passwd

NR : 用来记录行号
案例1:
awk -F: '{print NR}' /etc/passwd

FS : 指定文本内容分隔符(默认是空格)
案例1:
awk 'BEGIN{FS=":"}{print $NF, $1}' /etc/passwd
解析:
BEGIN{FS=":"} : 相当于指定以 : 为分隔符
$NF : 存储以 : 分隔符的最后一列
$1 : 存储以 : 分隔符的第一列
print : 打印

OFS : 指定打印分隔符(默认空格)
案例1:(输出的意思 分隔符会打印出来)
awk -F: 'BEGIN{OFS=" >>> "}{print $NF, $1}' /etc/passwd
FS 的优先级要高于 -F
解析:
BEGIN{OFS=" >>> "} : 指定打印分隔符
$NF : 存储以 >>> 分隔符的最后一列
$1 : 存储以 >>> 分隔符的第一列
print : 打印

三:awk运行处理规则的执行流程

1. BEGIN{}	: 最开始执行
2. //		: 正则
3. {}		: 循环体
4. END{}	: 最后执行

这里面最少有一个,最多有四个!

四:awk中的函数

	print	: 打印
	printf	: 格式化打印
	%s		: 字符串
	%d		: 数字
	-		: 左对齐
	+		: 右对齐
	15		: 至少占用15字符

awk中函数(格式化打印)
案例1:
awk -F: 'BEGIN{OFS=" | "}{printf "|%+15s|%-15s|\n", $NF, $1}' /etc/passwd

解析:
| : 以 | 为分隔符
|%+15s| : 以 | 为分隔符 %s 配合 printf 使用 代替当前字符串 右对齐 占用15字符
|%-15s| : 以 | 为分隔符 %s 配合 printf 使用 代替当前字符串 左对齐 占用15字符
\n : 换行符
$NF : 存储以 | 为分隔符的最后一列
$1 : 存储以 | 为分隔符的第一列

五:awk中的定位

1.正则表达式
案例1:(awk中匹配有root内容的行)
	awk -F: '/root/{print $0}' /etc/passwd
解析:
	/root/{print $0}	: awk中先执行正则 在执行循环 匹配文件内有root的每一行。
	       $0			:代表所有
案例2:(awk中匹配root开头的行)
	awk -F '/^root/{print $0}' /etc/passwd

六:比较表达式(匹配文本之内的内容)

	>		: 小于
	<		: 大于
	>=		: 小于等于
	<=		: 大于等于
	~		: 正则匹配(包含)
	!~		: 正则匹配(不包含)

案例1:
要求打印属组ID大于属主ID的行
awk -F: '$4 > $3{print $0}' /etc/passwd
解析:
$4 : 代表属组所在列
$3 : 代表属主所在列
$0 : 所有行

案例2:
打印结尾包含bash
awk -F: '$NF ~ /bash/{print $0}' /etc/passwd
解析:
$NF ~ /bash/ :尾部最后一列 包含 bash 的行
~ : 包含

a案例3:
打印结尾不包含bash
awk -F '$NF !~ /bash/{print $0}' /etc/passwd
解析:
!~ : 不包含 (将打印其他内容)

七:条件表达式(文本之外的内容)

==		
	>
	<
	>=
	<=

要求打印第三行
案例1:
awk -F: 'NR == 3{print $0} /etc/passwd'
解析:
NR : 行号
NR == 3 : 行号等于3

注意:
$1 : 是列
NR == 3 : 是行

八:逻辑表达式

	&&		: 逻辑与
	||		: 逻辑或
	!       : 逻辑非

案例1:(与(两者条件必须都成立))
awk -F: '$3 + $4 > 2000 && $3 * $4 > 2000{print $0}' /etc/passwd

案例2:(或(两者条件一个成立即可))
awk -F: '$3 + $4 > 2000 || $3 * $4 > 2000{print $0}' /etc/passwd

案例3:(非(条件取反))
awk -F: '!($3 + $4 > 2000){print $0}' /etc/passwd

九:算数表达式

	+	:加
	-	:减
	*	:乘
	/	:除
	%	:求余

1.要求匹配打印出属组 + 属主的ID 大于 2000 的
案例1:
awk -F: '$3 + $4 > 2000{print $0}' /etc/passwd

2.要求属组 * 属主的ID 大于 2000
案例2:
awk -F: '$3 * $4 > 2000{print $0}' /etc/passwd

3.要求打印偶数行
案例3:
awk -F: 'NR % 2 == 0{print $0}' /etc/passwd
解析:
NR :全部行号 除以 2 == 零的 零等于余数

偶数 : 2 4 6...

4.要求打印奇数行
案例4:
awk -F: 'NR % 2 == 1{print $0}' /etc/passwd

NR  :全部行号 除以 2 == 1的 零等于奇数

奇数: 1 3 5...

十:流程控制

简介:
	流程控制只存在循环之中

if:
awk -F: '{if($3>$4){print "大于"}else{print "小于或等于"}}' /etc/passwd
解析:
判断文件 第三列大于第四列的话打印(大于) 不大于 else

if 使用格式:
if(){} : 但分支
if(){}else{} : 双分支
if(){}else if(){}else{} : 多分支

for每一行打印10次
for 使用格式
awk -F: '{for(i=10;i>0;i--){print $0}}' /etc/passwd
解析:
i-- 相当于python中的 i-=1 : i=i-1
减到条件不成立为止
格式:
fro(i="初始值":条件判断:游标){}

while每一行打印10次
while 使用格式
awk -F: '{i=1; while(i<10){print $0, i++}}' /etc/passwd
解析:
i++ 相当于python中的 i+=1
加到条件不成立为止
格式:
while(条件判断){}

十一:实战案例(if判断打印隔五一行线)

1.使用if判断
每隔5行,打印一行横线
awk -F: '{if(NR%5==0){print "----------"}print $0}' /etc/passwd
解析:
	1. NR	: 每一行的行号
	2. 行号 除以 5 ==0
	3. 打印一行
	以此类推 4%5=0.8

点击查看原文章

标签:passwd,分隔符,NF,etc,详解,awk,linux,print
来源: https://www.cnblogs.com/zhengyan6/p/16290156.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有