day16 Linux三剑客之awk

1、什么是awk,主要作用是什么?

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

2、awk的格式

awk的格式:
awk [选项] '匹配规则和处理规则' [处理文本路径]
[root@localhost ~]# awk -F: '{print $1}' /etc/passwd # 打印第一行 标准输出 | awk [选项] '匹配规则和处理规则'
[root@localhost ~]# cat /etc/passwd | awk -F: '{print $1}' # 打印第一行 常用命令选项:
-F fs fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:
-v var=value 赋值一个用户定义变量,将外部变量传递给awk
-f scripfile 从脚本文件中读取awk命令
-m[fr] val 对val值设置内在限制,-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。 匹配规则主要是正则表达式
处理规则就有很多了:
设置变量
设置数组
数组循环
加减乘数运算
字符串拼接 匹配规则:
1、字符串
2、正则表达式 处理规则:
BEGIN{} : BEGIN是在awk处理文本之前运行 # 注:所有的变量的定义都应该放在BEGIN里面
// : 使用的匹配规则
{} :循环(每次只处理一行数据)
END{} :当所有的处理全部执行完毕之后,执行END中的相关操作 案例1:把/etc/passwd中的包含root的行打印出来
[root@localhost ~]# awk -F: '/root/' /etc/passwd 案例2:把/etc/passwd中以root开头的行打印出来
[root@localhost ~]# awk -F: '/^root/' /etc/passwd 案例3:将/etc/passwd中匹配第三列和第五列的数据
[root@localhost ~]# awk -F: '{print $3,$5}' /etc/passwd 案例4:打印以root或者ntp开头的行的解析器
[root@localhost ~]# awk -F: '/^(root|ntp)/{print $7}' /etc/passwd

3、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)的步骤
该过程一直持续到所有行处理完毕

4、awk中的变量

awk中的变量:
$0: 保存当前行的内容 # 打出所有
NR: 记录号(行号),每处理完一条记录,NR值加1 # 行号
NF: 保存记录的字段数,$1,$2...$100
FS: 输入字段分隔符,默认空格 # 'BEGIN{FS=":"}
OFS:输出字段分隔符 # 'BEGIN{OFS="+"}{print $3,$7}' 案例1:输出/etc/passwd中的所有内容包括行号。
[root@localhost ~]# awk -F: '{print NR,$0}' /etc/passwd 案例2:要求把第7行之后的内容输出出来,包括行号。
[root@localhost ~]# awk -F: 'NR>7 {print NR,$0}' /etc/passwd # 可以用条件来完成,NR代表行号 案例3:要求输出第7行之后的内容且第14行之前的内容输出出来,包含行号
[root@localhost ~]# awk -F: 'NR>7 && NR<14 {print NR,$0}' /etc/passwd 案例4:由案例3,要求输出每行的UID增加1
[root@localhost ~]# awk -F: 'NR>7 && NR<14 {print $3,$3+1}' /etc/passwd 案例5:要求输出倒数第3列
[root@localhost ~]# awk -F: '{print $(NF-2)}' /etc/passwd # 在这里NF代表最后一列 案例6:要求不使用-F参数,以:分割,并输出第3列和第5列
[root@localhost ~]# awk 'BEGIN{FS=":"}{print $3,$5}' /etc/passwd 案例7:要求实验证明-F 和 FS的优先级
[root@localhost ~]# awk -F/ 'BEGIN{FS=":"}{print $3,$5}' /etc/passwd # FS优先级>-F 案例8:要求以:分割,并输出第3列和第7列,第三列和第五列之间使用+号分割
[root@localhost ~]# awk -F: 'BEGIN{OFS="+"}{print $3,$7}' /etc/passwd

5、格式化输出

格式化输出
printf格式:
awk -F: '{printf "用户名:%s 用户id:%s\n",$1,$3}' /etc/passwd
awk -F: '{printf "|%-15s| %-10s| %-15s|\n", $1,$2,$3}' /etc/passwd
%s 字符类型
%d 数值类型
占15格的字符串
- 表示左对齐,默认是右对齐
printf默认不会在行尾自动换行,加\n
[root@localhost ~]# awk -F: 'BEGIN{OFS=" "}{printf "%-4d %s\n", $3,$7}' /etc/passwd 案例1:要求输出第1列和最后一列,排版整齐
第一种方法:
[root@localhost ~]# awk -F: '{printf "%-15s %s\n",$1,$NF}' /etc/passwd 第二种方法:适用于字符特别长的
[root@localhost ~]# awk -F: '{print length($1)}' /etc/passwd # 得到最长字符的个数
[root@localhost ~]# awk -F: '{printf "%-15s %s\n",$1,$NF}' /etc/passwd

6、操作模式

1)、正则模式
[root@localhost ~]#awk -F: '/^root/' /etc/passwd # //包含 2)、比较模式
> <
[root@localhost ~]# awk -F 'NR > 7' /etc/passwd # 比较> 3)、条件模式
[root@localhost ~]# awk -F: 'NR>7 && NR<14 {print NR,$0}' /etc/passwd # 达成条件执行 4)、算数运算
[root@localhost ~]# awk -F '{print $3,$3+1}' /etc/passwd # 给uid加1 5)、范围模式
[root@localhost ~]# awk -F: '/root/,/ftp/{print $1}' /etc/passwd # root到ftp的范围

7、流程控制

if

if判断:
单分支
if () {} 双分支
if () {} else {} 多分支
if(){} else if() {} else{} 案例1:打印奇数行的数据
[root@localhost ~]# awk -F: '{if(NR%2){print NR,$0}}' /etc/passwd 案例2:打印偶数行的数据
[root@localhost ~]# awk -F: '{if(NR%2==0){print NR,$0}}' /etc/passwd
[root@localhost ~]# awk -F: 'NR%2==0{print $0}' /etc/passwd # 单分支不加if也可以
注:单分支情况下是可以省略if,多分支情况下不能省略 案例3:要求打印出偶数行中的包含bash的行
[root@localhost ~]# awk -F: '/bash/{if(NR%2==0){print NR,$0}}' /etc/passwd 案例4:要求在奇数行前输出奇数,偶数行前输出偶数
[root@localhost ~]# awk -F: '{if(NR%2){printf "奇数行:%s\n",$0}else{printf "偶数行:%s\n",$0}}' /etc/passwd 案例5:在前7行前加7, 前14行前加14,其他原样输出
[root@localhost ~]# awk -F: '{if(NR<=7){printf "7 %s\n",$0,NR}else if(NR<=14){printf "14 %s\n",$0}else{print $0}}' /etc/passwd

for循环

for循环:
for (变量 in 数组) {语句}
for (变量;条件;表达式){语句} 知识储备:
++ : 每次加1
-- : 每次减1 案例1:将/etc/nginx/nginx.conf中的所有的词的个数
[root@localhost ~]# egrep -o '[0-9a-zA-Z]+' /etc/nginx/nginx.conf | awk '{arr[$1]++}END{for (i in arr){printf "%-15s %d\n", i,arr[i]}}' 案例2:要求统计以#开头的行中包含的词的格式
[root@localhost ~]# egrep '^ *#' /etc/fstab | egrep -o '[0-9a-zA-Z]+' /etc/nginx/nginx.conf | awk '{arr[$1]++}END{for (i in arr){printf "%-15s %d\n", i,arr[i]}}' 案例3:输入一个文件路径,要求打印出它的数字权限(不允许使用stat)
[root@localhost ~]# ll /etc/fstab | awk 'BEGIN{FS=""}{if($2=="r"){u+=4} if($3=="w"){u+=2} if($4=="x"){u+=1} if($5=="r"){g+=4} if($6=="w"){g+=2} if($7=="x"){g+=1} if($8=="r"){o+=4} if($9=="w"){o+=2} if($10=="x"){o+=1}}END{print u,g,o}'

while循环

while循环
格式:while(判断条件) {} 案例1:统计/etc/passwd中每个解析器的用户数
[root@localhost ~]# awk -F: '{arr[$NF]++}END{for (i in arr){print i,arr[i]}}' /etc/passwd 案例2:把/etc/passwd/中的每一行都重复打印3遍
[root@localhost ~]# awk -F: '{i=0;while (i<3){print $0;i++}}' /etc/passwd 案例3:要求把/etc/passwd中第10行中每一列都打印出来
[root@localhost ~]# awk -F: 'NR==10{i=0;while(i<=NF){print $i;i++}}' /etc/passwd

day16 Linux三剑客之awk的更多相关文章

  1. Linux实战教学笔记18:linux三剑客之awk精讲

    Linux三剑客之awk精讲(基础与进阶) 标签(空格分隔): Linux实战教学笔记-陈思齐 快捷跳转目录: * 第1章:awk基础入门 * 1.1:awk简介 * 1.2:学完awk你可以掌握: ...

  2. (转)不看绝对后悔的Linux三剑客之awk实战精讲

    原文:http://blog.51cto.com/hujiangtao/1923930 一.Linux三剑客之awk命令精讲 第1章 awk基础入门 1.1 awk简介 awk不仅仅时linux系统中 ...

  3. 磁盘分区 & Linux 三剑客之 awk

    今日内容 磁盘分区 Linux 三剑客之 awk 内容详细 一.磁盘分区 磁盘分区 --> 挂载 步骤 1.关机 2.添加硬盘 3.创建分区 fdisk /dev/sdb or gdisk /d ...

  4. Linux 三剑客之 awk 实战详解教程

    我们知道 Linux 三剑客,它们分别是:grep.sed.awk.在前边已经讲过 grep 和 sed,没看过的同学可以直接点击阅读,今天要分享的是更为强大的 awk. sed 可以实现非交互式的字 ...

  5. 一篇文章带你学会Linux三剑客之一:awk

    awk是一种用于处理文本.模式匹配的编程语言.与sed和grep,俗称Linux下的三剑客.学会 awk 等于你在 Linux 命令行里,又多了一种处理文本的选择.这篇文章重点教你如何使用,看完这篇文 ...

  6. Linux三剑客之awk命令

    awk简介 awk其名称得自于它的创始人 Alfred Aho .Peter Weinberger 和 Brian Kernighan 姓氏的首个字母.实际上 AWK 的确拥有自己的语言: AWK 程 ...

  7. 详解Linux三剑客之awk

    第一篇 awk简介与表达式实例 一种名字怪异的语言 模式扫描和处理,处理数据和生成报告. awk不仅仅是linux系统中的一个命令,而且是一种编程语言:它可以用来处理数据和生成报告(excel):处理 ...

  8. Linux三剑客之awk精讲(基础与进阶)

    第1章 awk基础入门 要弄懂awk程序,必须熟悉了解这个工具的规则.本实战笔记的目的是通过实际案例或面试题带同学们熟练掌握awk在企业中的用法,而不是awk程序的帮助手册. 1.1 awk简介 一种 ...

  9. Linux三剑客之awk

    awk awk是linux下的一个命令,他对其他命令的输出,对文件的处理都十分强大,其实他更像一门编程语言,他可以自定义变量,有条件语句,有循环,有数组,有正则,有函数等.他读取输出,或者文件的方式是 ...

随机推荐

  1. fork函数详解(附代码)

    虽然篇幅很长,但大多是易懂的代码,不用担心看不完 这里的所有操作,都将在下面的代码中有所体现 fork会拷贝当前进程的内存,并创建一个新的进程.如上图,fork函数会将整个进程的内存镜像拷贝到新的内存 ...

  2. Linux 用户&用户组

    用户和用户组的概念 用户 ---> 使用操作系统的人 Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系 ...

  3. 快速排序--洛谷卡TLE后最终我还是选择了三向切割

    写在前边 这篇文章呢,我们接着聊一下排序算法,我们之前已经谈到了简单插入排序 和ta的优化版希尔排序,这节我们要接触一个更"高级"的算法了--快速排序. 在做洛谷的时候,遇到了一道 ...

  4. [linux]centos7.4上安装MySQL-8.0.11【完美安装】

    版本声明 centos7.4 MySQL-8.0.11 1.我用的阿里云的虚拟主机,刚从windows换到linux,需要装下常用工具 #安装下sz rz常用到上传下载的命令 yum install ...

  5. 第四周PTA笔记 好吃的巧克力+特殊的翻译+下次一定(续)+走迷宫

    好吃的巧克力 超市正在特价售卖巧克力,正好被贪吃的Lucky_dog看见了. 巧克力从左到右排成一排,一共有N个,M种. 超市有一个很奇怪的规定,就是你在购买巧克力时必须提供两个数字a和b,代表你要购 ...

  6. Salesforce Consumer Goods Cloud 浅谈篇二之门店产品促销的配置

    本篇参考:https://documentation.b2c.commercecloud.salesforce.com/DOC1/index.jsp?topic=%2Fcom.demandware.d ...

  7. 通过修改host加速访问GitHub

    加速访问GitHub 原理:绕过 DNS 解析,直接使用本地的 DNS 记录进行直接跳转. 可以通过 http://ping.chinaz.com/ 链接查询github的DNS信息,例如,可以直接打 ...

  8. PAT A1060——string的常见用法详解

    string 常用函数实例 (1)operator += 可以将两个string直接拼接起来 (2)compare operator 可以直接使用==.!=.<.<=.>.>= ...

  9. [loj2469]最小方差生成树

    2018年论文题 约定:令点集$V=[1,n]$.边集$E=[1,m]$,记$m$条边依次为$e_{i}=(x_{i},y_{i},c_{i})$(其中$1\le i\le m$),将其按照$c_{i ...

  10. idea添加插件后重启后报错:cannot load project xxxx 解决方案

    问题原因:新安装的idea下载插件后重启报错 找到windows上c:\Users\.IntelliJIdea<版本>\config\plugins\这个目录,然后 将对应插件删除