ICode9

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

15Linux三剑客之awk命令

2021-10-09 21:04:57  阅读:121  来源: 互联网

标签:案例 passwd 15Linux etc awk print root 三剑客


目录

awk命令

AWK 是一种处理文本文件的语言

awk 主要用来处理文件,将文本按照指定的格式输出。其中包含变量,循环以及数组

awk [选项] '匹配规则和处理规则' [处理文本路径]

选项

-F			指定输入文件折分隔符

匹配规则

字符串


正则表达式

匹配规则主要是正则表达式

处理规则

设置变量
设置数组
数组循环
加减乘数运算
字符串拼接
BEGIN{}		: BEGIN是在awk处理文本之前运行
//			: 使用的匹配规则
{}			:循环(每次只处理一行数据)
END{}		:当所有的处理全部执行完毕之后,执行END中的相关操作

案例

案例1:把/etc/passwd中的包含root的行打印出来

[root@localhost ~]#awk  '/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

案例2:把/etc/passwd中以root开头的行打印出来

[root@localhost ~]#awk '/^root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash

案例3:将/etc/passwd中匹配第三列和第五列的数据

awk -F: '{print $3,$5}' /etc/passwd

案例4:打印以root或者mysql开头的行的解析器

[root@localhost ~]#awk '/^(root|mysql)/' /etc/passwdroot:x:0:0:root:/root:/bin/bashmysql:x:997:995::/home/mysql:/sbin/nologin

awk的工作原理

(1)awk会接收一行作为输入,并将这一行赋给awk的内部变量$0,每一行也可称为一个记录,行的边界是以换行符作为结束(表明:awk是一行一行的去处理文本的)(2)然后,刚刚读入的行被以:为分隔符分解成若干字段(或域),每个字段存储在已编号的变量中,编号从$1开始,最多达100个字段注意:如果未指定行分隔符,awk将使用内置变量FS的值作为默认的行分隔符,FS默认值为空格,如果说要指定分隔符,需要使用-F参数或者重新定义FS变量(3)使用print函数打印,如果$1$3之间没有逗号,它俩在输出时将贴在一起,应该在$1,$3之间加逗号,该逗号与awk的内置变量OFS保持一致,OFS默认为空格,于是以空格为分隔符输出$1和$3我们可以指定:awk -F: 'BEGIN{OFS="-"}{print $1,$3}' /etc/passwd(4)输出之后,将从文件中获取另一行,然后覆盖给$0,继续(2)的步骤将该行内容分隔成字段。。。继续(3)的步骤该过程一直持续到所有行处理完毕

awk中的变量

$0: 保存当前行的内容NR: 记录号(行号),每处理完一条记录,NR值加1NF: 保存记录的字段数,$1,$2...$100FS: 输入字段分隔符,默认空格OFS:输出字段分隔符

注: -F参数的优先级小于FS变量的优先级

​ 所有的变量的定义都应该放在BEGIN里面

案例

案例1:要求输出第7行之后的内容且第12行之前的内容输出出来,包含行号

[root@localhost ~]#awk 'NR>7&&NR<12 {print NR,$0}' /etc/passwd8 halt:x:7:0:halt:/sbin:/sbin/halt9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10 operator:x:11:0:operator:/root:/sbin/nologin11 games:x:12:100:games:/usr/games:/sbin/nologin

案例2: 要求输出倒数第3列

awk -F: '{print $(NF-2)}' /etc/passwd

案例3:要求以:分割,并输出第3列和第5列,第三列和第五列之间使用+号分割

awk -F: 'BEGIN{OFS="+"}{print $3,$5}' /etc/passwd

格式化输出

printf函数

%s 字符类型%d 数值类型占15格的字符串- 表示左对齐,默认是右对齐printf默认不会在行尾自动换行,加\n

案例

案例1:要求输出第1列和最后一列,排版整齐

[root@localhost ~]#awk -F: '{printf "%-16s %s \n", $1,$NF}' /etc/passwd

操作模式

1、正则模式awk -F: '/^xxx/' /etc/passwd2、比较模式> < awk -F 'NR > 7' /etc/passwd3、条件模式awk -F 'NR > 7' /etc/passwd4、算数运算awk -F '{print $3,$3+1}' /etc/passwd 5、范围模式awk -F: '/root/,/ftp/{print $1}' /etc/passwd

流程控制

if判断

单分支if () {}双分支if () {} else {}多分支if(){} else if() {} else{}注:单分支情况下是可以省略if,多分支情况下不能省略
案例

案例1:打印奇数行的数据

awk -F: '{if(NR%2==1){print NR,$0}}' /etc/passwd
awk -F: '{if(NR%2){print NR,$0}}' /etc/passwd
awk -F: 'NR%2==1{print NR,$0}' /etc/passwd

案例2:要求在奇数行前输出奇数,偶数行前输出偶数

awk -F: '{if(NR%2){printf "奇数行:%s\n",$0}else{printf "偶数行:%s\n",$0}}' /etc/passwd

for循环

for (变量 in 数组) {语句}for (变量;条件;表达式){语句}

案例

案例1:统计 /etc/nginx/nginx.conf中的所有的词的个数

egrep -o "[a-zA-Z0-9]+" /etc/nginx/nginx.conf|awk '{l1[$1]=l1[$1]+1}END{for(i in l1){printf "%-10s %s \n", i,l1[i] }}'
egrep -o "[a-zA-Z0-9]+" /etc/nginx/nginx.conf|awk '{l1[$1]++}END{for(i in l1){printf "%-10s %s \n", i,l1[i] }}'

案例2:输入一个文件路径,要求打印出它的数字权限(不允许使用stat)

[root@localhost ~]# ll  | awk 'BEGIN{FS=""}{if($2=="r"){u=u+4} if($3=="w"){u=u+2} if($4=="x"){u=u+1} if($5=="r"){g=g+4} if($6=="w"){g=g+2} if($7=="x"){g=g+1} if($8=="r"){o=o+4} if($9=="w"){o=o+2} if($10=="x"){o=o+1}}END{print u,g,o}'

标签:案例,passwd,15Linux,etc,awk,print,root,三剑客
来源: https://www.cnblogs.com/hhf1751342707/p/15387538.html

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

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

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

ICode9版权所有