《AWK 基础入门讲解实战视频课程》笔记

【awk作用】

默认逐行处理文本或者命令输出(如果保存到文件,本质上也是文本),用来处理命令输出时很有用。

更准确地讲是适合处理表格式的文本的。

{cmd}花括号每执行一次就把结果打印一行在终端上。

行:record

列:field

?
?

【awk课程简介】

理论不说了,直接实验上截图吧。

AWK来源不说了,百度百科吧。

AWK版本不说了。

awk命令的位置:

老师写了个播放音乐的脚本,先下载mplayer

ping www.baidu.com

sudo apt-get update

sudo apt-get install mplayer

【awk工作模式】

测试文件:

awk过滤第一列:

字段

字段分隔符:空白(一种视觉效果)

逐行读取处理命令工作模式

不要用双引号,会出错:

【awk指定多个分隔符】

不是空白分隔符的情形:

指定分隔符:

正则:

[中括号表示任意一个]

+连续的多个当做一个来处理

[: ]+ 连续的多个:
连续的多个空格
连续的多个组合:空格

指定多种分隔符:

tr替换:cat file | tr ‘:‘ ‘\t‘

多个空格、制表符合并为空白:

awk提取ip地址:ifconfig eth0|grep ‘t a‘|awk -F‘[: ]+‘ ‘{print $4}‘

【awk内置变量NF讲解】

用sed把冒号:替换成空格,tr不能真正替换

sed -ir ‘s/:+/ /g‘ file

全乱了,放弃工作区的修改:

awk同时取多列,用逗号连接,用分号连接则被当成命令,或者把逗号换成双引号放打印的:

" "打印一个空格和加逗号分隔的效果一样,因为逗号默认一个空格分隔字段打印

" "打印两个空格

" "打印三个空格

awk取每行最后1个构成列打印,NF内置变量:保存每行的字段数目,逐行处理的时候,会检查每行的NF

$列数(从1索引)

如果每行字段数目不一样呢:如果用具体魔数就能打印,所以要用特殊意义的变量:

awk ‘{command}‘

取倒数第二列呢?

如果你不加括号的话会变成加减法:

NF number of field 字段数目

【awk内置变量NR和FNR介绍】

number of recording 就是处理过的行数

继续继续,搞起来:

FNR又是什么?

NR表示awk一次处理的总行数,FNR呢?

FNR会每次只处理一个文件,原来是这个区别啊!

$0 会打印所有列,空即是有,有即是空

awk ‘NR==FNR{print $0}‘ file file1 条件执行

NR==FNR会比较这两者的单独输出,单独输出上面已经截图了:

那么不等呢,FNR只有处理多个文件时才用到:

取第二行到第三行怎么取:cat file | awk ‘NR>1&&NR<4{print $0}‘

因为awk是逐行处理的,所以命令都是作用于一行的,

如果想单独处理某几行则用条件表达式处理NR即可。

【awk中pattern介绍】

命令模式,先看命令(函数/行为/动作/action)执行条件/判断/option/pattern

awk ‘<cond>{command}‘ 只有{command}默认执行花括号内的命令

awk ‘NR!=1{command}‘

awk ‘1{command}‘

awk ‘2{command}‘ 不可以是负数

awk ‘0{command}‘

awk ‘"0"{command}‘ 任何字符串都是真

awk ‘a{command}‘ 没有赋值的变量为假

awk ‘{a=1}a{command}‘ {a=1}变量赋值方法

每次把‘‘内的命令作用于每一行,而每个{}分别对每一行执行一次:

注意:这里是NR==n,注意是两个等号。

?
?

【awk中BEGIN和END简介】

cat file|awk ‘BEGIN{print "===Grade==="}{print $0}‘

cat file | awk ‘BEGIN{print "===Grade==="}{print $0}END{print "===Tail==="}‘

BEGIN最常用的是给变量赋值在文件还没有读取之前,BEGIN就是一个特殊模式

END最常用的是完事后打印数组

pattern{action}pattern1{action1}pattern2{action2}

【awk有关计算的方法】比较常用的

给文件多增加一列,也就是增加一个字段啦:

cat file|awk ‘{print $0,$3+$4+$5}‘

cat file|awk ‘{print $0,$3+$4+$5,($3+$4+$5)/3}‘ 支持输出除法4位小数

cat file|awk ‘{print $0,$3+$4+$5,int(($3+$4+$5)/3)}‘

如何使用变量提取重复使用的东西,减少输入和不友好:

cat file|awk ‘{a=$3+$4+$5;print $0,a,int(a/3)}‘

创建一个包含1~10的文本文件:seq 10 > 10.txt,seq用于一堆数字的简化写法:

出错了:

如何计算某列的全部值相加:

这里就体现了END的作用了,就是只处理最终的结果的意思。

如果想求最后1列的所有值得和:

求1列的和有什么作用呢?一般用在终端里面算CPU的占用率很方便

CPU在第三列,所以先过滤出某几行(NR==法或者grep法)

内存是第四列,

从而统计出某个进程的占用的资源

简单加法:

【awk中if简单讲解】

Q-Dir资源管理器不错

if能有什么实际用处呢?

awk ‘{if($3>=80)print $0}‘逻辑更清楚,虽然打字多了

awk ‘$3>=80{print $0}‘ 之前‘pattern{action}‘的格式,这属于先过滤行,而if是属于处理行,所以过滤行在{}之外,而if在{}命令之内

我们用if语句过滤出某列满足特定条件的行出来:

再从里面过滤出文件:

/^-/这个模式时匹配两杠之间的东西,-表示普通文件,所以此时用if就更加清楚了,把正则用来匹配pattern,把if用来判断条件

if判断输出第一行:

取出行数NR大于1的行:

取出某列符合条件的行:cat file|awk ‘{if($3>58)print $0}‘

?
?

【awk中变量介绍】用分号;

自己起变量建议全部小写,因为好多内置变量都是全部大写的,所以自己起都用小写。

一般在BEGING里面赋值变量,因为BEGIN是在文件处理之前赋值变量的:

a在bash里面赋值了,如果要在awk里面引用则必须用‘$a的模式‘

改成‘$a‘模式

改成$‘$a‘模式

或者重新在awk里面定义变量,但是不在{}里面就可以不加引号:cat file|awk -va=$a ‘{print $a}‘

用来引用外部变量

标准变量赋值方法:-v v是variable的意思,v后面可以有空格也可以没有空格

?
?

?
?

【awk中for循环简介】注意:起始值从1开始

for循环一般用来循环数组的。

如何让一行中的每个字段占一行打印:cat file|awk ‘{for(i=1;i<=NF;i++)print $i}‘

for循环可以让你取多个连续的列:

print自动换行

printf不自动换行,要加\n

?
?

for循环能做哪些实际的有用的东西呢?

打印空的话自动占一行print

如何取出奇数列,记住是从1索引的

最外层的{}是针对一行的,然后内部的{}则是分别对这一行按顺序操作一遍

printf "\n"

字符串要用""引起来:$0表示打印出当前处理的行

最外层{}里面的语句用;分隔和用{}分隔的意思是一样的,都是表示把该行当做输入参数执行多条语句:

替换某列的某个变量

cat file | awk ‘{if($1==‘lx‘){print $0}else{$1="lx";print $0}}‘

{}就相当于块语句一样

?
?

?
?

【awk正则简介】

awk调用外部命令,用双引号引起来的是命令

awk ‘BEGIN{while("who"|getline)n++;print n}‘ 用分号;的话可以不加{}

一般不再awk语句中使用双引号引用外部命令,而是把外部命令的结果通过管道传递个awk处理:

END表示要最后一个结果,中间过程不要显示了。

?
?

重定向结果显示:

在外面重定向是一样的,关键是显示什么:

一般重定向也是在外面做:

在SSH中无法完成重定向,不知道怎么解决,不用就好了:

发现如果SSH登陆时选择接受并保存权限可以提高,可以解决这个问题:

如果要过滤出以ll开头的行 ‘/^ll/‘

如何用sed取出ip地址:ifconfig eth0|grep ‘t a‘|sed ‘s/^.*r:\(.*\) Bc.*$/\1/g‘

p是present,g是替换

sed -n ‘s/pattern/\1/p‘

^开头

$结尾

\1是后向引用,但是awk不支持后向引用-_-

【awk正则深入】awk两个斜线之间表示正则表达式

两个斜线之间的正则表达式匹配是作用于每一行的每次,会匹配任意模式:

如何把正则表达式模式匹配到一个字段中:

正则表达式,其实隐含了if语句,凡是匹配处,默认都隐含了判断啊:注意,if必须放到{}内,而pattern则是放在{}外的:

正则表达一般是作用于每行的某个具体字段的

在if上叠加多层过滤:

可以通过pattern和if的组合,避免用&& ||

?
?

?
?

【awk简单总结】

who 查看有几个用户登录了

awk普通模式必须要有输入文件,而BEGIN模式不需要输入文件

在awk里面可以shell命令,其实最好是在外面用命令,然后用awk处理

默认输出

不加$0相当于输出行:

文件名需要引起来如果在内部的话,外部的话不需要双引号把文件名引起来

参数:

-f 表示从文件读命令

awk -f xxx.txt

awk -f xxx.txt file

?
?

RS记录分隔符,默认是\n,可见相当可配置化啊。

输出分隔符{OFS="+"},适用于分隔每行的多个输出而不是每行之间:

RS使用,一般在BEGIN里面赋值变量(内部或者外部)

嫌弃显示太多,显示前十行吧:

?
?

【awk取文件列】awk处理多个文件时默认是向下拼接的

如何组合多个文件中的多个列形成一个新文件:用数组承接新文件

用数组做,还记得pattern{action}吗!

awk ‘NR==FNR{a[NR]=$1}NR!=FNR{print a[FNR],$2}‘ file file1

awk会处理file和file1的10行内容,每次处理1行

处理file的行时,只有{a[NR=$1]}也就是a[1]=ll a[2]=kk

处理file1的行时,只有{print a[FNR], $2}执行,a[1] 列2

你没学的东西可以用笨方法实现哦:

不用数组虽然麻烦,多做了些修订,也行!

?
?

【awk中for循环与技术】记住awk每次用‘{}‘处理一行,然后逐行重复。用END打印最后的结果。

想统计文件里面有多少个单词怎么办?

用wc厕所来算:

用awk来算:

没有END的时候:

统计行数呢?

END表示文件全部处理完成后,awk就要退出前执行的意思。

?
?

如何统计某个单词在文件中出现的次数呢?因为单词两边是空白分隔的嘛,所以就逐行然后逐字段匹配嘛?

cat /root/pwb/tmp/md5/check.sh | awk ‘{for(i=1;i<=NF;i++){if($i=="echo"){n++}}}END{print n}‘

上面这个n为空嘛,所以打印了空行。

?
?

【awk中对列累加】

命令 df -h 可以查看硬盘使用率情况:

awk ‘‘无输出,因为无处理嘛

awk ‘/\/dev\/sda/‘ 正则默认过滤出每一行pattern

注意转义字符

-F 指定每行字段的分隔符

现在我们要把上面的数字字段给分隔出来:

上面这是比较常用的用法,可以用来检测某个值啊!

df -hi 查看inode

inode存目录,满了就要清理小文件了,所以你要检测使用资源的情况。

iblock存内容

所以上面取磁盘利用率的脚步同样可以用来检测inode资源使用率

用sed丢弃第一行 sed ‘1d‘

统计某个列的和:

不定义变量直接用即可,如果初始值也是0的话:

?
?

【awk中删除文件后四行】

seq 10 > 10.txt

如何删除文件尾部四行?

sed ‘$d‘ 删最后一行

用awk怎么做?

这里利用了awk读取多个相同文件的技巧:

NR==FNR{表示处理第一个文件}NR!=FNR{表示处理第二文件也就是第一个文件}

思路比较傻瓜化,先知道行数嘛。

这儿还有个利用head的方法,这类命令的功能是很强大的,它几乎考虑了所有情况,如果认真看man手册的话:cat 10.txt|head -n -4 显然效率高多了,sed也可以,但是不会:

?
?

?
?

【awk最后总结】

  • 记得把命令放到{}内,if也放{}里面
  • pattern不需要放{}内,放{}前面就可以了
  • 正则也是pattern
  • awk本身就相当于一个行循环,$i就相当于内部元素循环
  • 字符后者外部变量要放到双引号""里面
  • 变量是字符串默认是空如果未定义的话
  • 对于任意一个文件,不是标准的表格形式,所以用内置变NF NR
  • {}内部嵌套就好比块语句嵌套了
  • awk也是一种编程语言,是弱类型的,所以不要声明,直接用变量即可
  • 可以处理相同的文件多次
  • NF和NR容易混淆,老师当时学也是背了好久,所以技术在于坚持积累

?
?

打印整个文件:

1就是一个模式,默认打印出来整个文件:

改成0没反应:

替换并打印:

cat file|awk ‘{$1="lx"}‘

相当于:

缩写而已,不要看懵逼了!

?
?

用awk代替grep,不就是正则过滤每行么:区别是grep有彩色

提取IP:

?
?

NF\NR\FNR

?
?

算CPU占用率之和:

?
?

看视频时候短时间学习一个知识点,不过如果学习的话还是看书好一点,毕竟视频都是浓缩过的。

?
?

时间: 2024-12-23 21:46:21

《AWK 基础入门讲解实战视频课程》笔记的相关文章

SQL 笔记 By 华仔

-------------------------------------读书笔记------------------------------- 笔记1-徐 最常用的几种备份方法 笔记2-徐 收缩数据库的大小的方法 笔记3-徐 设置数据库自动增长注意要点 笔记4-徐 模仿灾难发生时还原adventurework数据库 示例 stopat 笔记5-徐 检查日志文件不能被截断的原因 笔记6-徐 检测孤立用户并恢复孤立用户到新的服务器 解决数据库镜像孤立用户问题 笔记7-徐 SQLSERVER日志记录

SQL笔记---多表左联

这是实际场景当中的一个例子,拿出来分析总结思路. -- SQL 查询 --SELECT  orderQuery.Rk_SkuCode ,        orderQuery.SkuName,        SUM(ISNULL(orderQuery.OrderTotal, 0))        - SUM(ISNULL(removeQuery.RemoveTotal, 0))        - SUM(ISNULL(pickQuery.PickTotal, 0))        - SUM(IS

SQL笔记---分页

随用随想,随用随记. 通过实际应用掌握SQL语句. 一. SQL分页 1. 第一种方法:利用ID大于多少进行筛选 SELECT TOP 20        *FROM    dbo.WMS_StockWHERE   ( Rk_SkuCode > ( SELECT MAX(Rk_SkuCode)                         FROM   ( SELECT TOP 40                                            *           

《HeadFirst SQL》笔记

规范化 0 约束 1 原子性 2 第一范式 1NF 3 数据模式 4 依赖 5 联接查询 6 交叉联接(AKA 笛卡尔联接,叉积) 7 内联接 8 子查询 9 外联接 10 自联接 11 集合 12 事务 13 ACID 14 管理事务 15 常用语句 16 注意 17 规范化 约束 NOT NULL UNIQUE PRIMARY KEY DEFAULT FOREIGN KEY:引用父表的某个唯一值引用完整性:插入外键列的值必须已经存在于父表的来源列中 --创建外键 create table i

SQL笔记1:SELECT及SELECT高级应用

T-SQL笔记1:SELECT及SELECT高级应用 本章摘要 1:安装AdventureWorks 2:基本运算符和表达式 3:between 4:like 5:escape 6:TOP 7:GROUP BY 7.1:GROUP BY ALL 7.2:HAVING 8:SELECT字句技术 8.1:使用DISTINCT消除重复值 8.2:返回拼接的结果 8.3使用INTO字句 9:子查询 9.1:子查询类型 9.2:代替表达式的查询 9.3:多层嵌套 10:比较使用 EXISTS 和 IN 的

金典 SQL笔记(6)

page223-索引 --利用SQL 语句创建索引 --CREATE INDEX 索引名称on 表名(字段 ,字段, 字段字段n) --索引名称必须为唯一的,字段 ,字段, 同意一个到多个 --范例为T_person 表中给FName创建索引索引名为 idx_person_name CREATE INDEX idx_person_name ON T_Person (FName) --删除索引 --drop index 表名索引名 DROP INDEX T_person.idx_person_na

Mybatis 项目开发实际常用SQL笔记总结

parameterType 和 resultType parameterType:单个参数用String,多个参数用map resultType:   可以是 Integer.String.Object    <select id="countGroupMasterByUid" parameterType="String" resultType="Integer">      SELECT              COUNT(id)

sql笔记/分页存储过程

[email protected]c#中进行++操作可以是整数或小数,sql中只能对整数进行++操作.char类型 适合存储长度波动较小不回收效率高varchar 类型 适合存储长度波动较大可以回收nchar代表unicode 存储内容包括汉字时候考虑加n SQL语句特点1不区分大小写2没有双引号所有字符串都包含在单引号3没有逻辑相等,逻辑相等和赋值一样都是用=4没有bool值得概念,但是在视图中可以输入true/false5也有关系运算符.6也有逻辑运算符 &&-- and || --o

sql笔记

1. 看下面sql,重点有两个,一个是distinct  ,一个是树形结构查询 select DISTINCT t.unit_code from t_unit_relation t where t.corp_tn='jiaozhougongan' start with t.unit_code='0001' connect by prior t.unit_code = t.unit_upcode 分析: ① distinct:去重复值 ② 树形结构查询,这个博客:http://www.cnblog

HeadFirst SQL 读书摘要

数据库都是用 圆柱形表示的. 数据库中包含表 表中包含行和列 行又叫记录record,  列又叫 字段field 创建数据库 create database mypipe_l; 选择数据库 use mypipe_l; 创建表 create table doughnut( name VARCHAR(10), type VARCHAR(6) ); 查看表 desc doughnut; 删除表 drop table doughnut; 插入数据 insert into doughnut (name,