流编辑器-awk

awk

流编辑器sed,用于对行进行删除,替换等操作,awk更适合用来排版。

awk工作流程

awk将文本的内容逐行读取到内存中,awk会对读取进内存的行通过某种分隔符(默认为空格\t)进行分块,分块后会对各个块命名
$0-整个行,$1-第一个块,$2-第二个块...$n-第n个块.此时可以指定awk操作的块.同sed一样,awk会通过模式匹配需要操作的
行,不同的是对于未匹配的行,awk会将其忽略。

#ifconfig eth0 | awk ‘/inet addr/{print $2}‘ | awk -F: ‘{print $2}‘

注*
1.awk通过模式/inet addr/匹配特有的行,然后再默认分割符分块的情况下打印第二块.
2.通过指定分割符:将内容分为俩段,打印第二块。

awk的语法

awk [-F] ‘/模式/{命令}‘  file
1.通过模式匹配需要操作的行,未匹配到的行忽略.
2.awk常用于排版,常用的命令为print
3.分割符可加参数F指定

awk中的变量-NF,NR,FNR
1.NF:对读取进内存的行的分块数.
#ifconfig eth0 | awk ‘/inet addr/{print NF}‘
->4

注:在awk中,引用变量不需要加$(除了引用块$n),$NF代表$4
#ifconfig eth0 |awk ‘/inet addr/{print $NF}‘
->mask:255.255.255.0   ----打印第四块

2.NR,FNR
1.对于同一文件而言,NR和FNR代表的都是读取当前操作的行.
2.对于同时操作2个文件时,NR代表读取当前操作的行,而FNR读取的是每个文件操作的当前的行.

demo:存在俩个文件file1,file2.其中file1中有4行,file2中有2行。

#awk ‘{print NR}‘ file1 file2
1
2
3
4
5
6
#awk ‘{print FNR}‘ file1 file2
1
2
3
4
1
2

注:当对多个文件操作时,判断是对哪个文件进行操作,比较NR和FNR的值即可.

在{}执行多条命令时,需要用;号隔开
#ifconfig eth0 | awk ‘{print NR,$2;print NR}‘                   -------默认有换行符

在awk中做比较
1.数字比较用到的运算符:==,>=,>,<,<=
2.表示字符串能否匹配上的符号:~

注:比较时,在模式位置数字不必用//环绕,字符串需要用//环绕起来.

#awk -F: ‘$3>=500{print $1}‘  /etc/passwd

->打印/etc/passwd中uid>500的普通用户的用户名

#awk -F:  ‘/^root/{print $1}‘ /etc/passwd

->打印/etc/passwd中以root开头的行.

可用&&和||运算符连接多个条件.
#awk -F: ‘$3==0||$3>=500{print $1}‘ /etc/passwd

->打印/etc/passwd中的root用户和普通用户.

对于字符串的比较则是判断字符串能否匹配上
#awk -F: ‘/root/{print }‘ /etc/passwd
#awk -F: ‘$5 ~/root/{print }‘ /etc/passwd

->第一个语句是在文件中搜寻包含root的行打印出来,而第二句则是在文件中按:分割开来,匹配第5部分的root后打印出来.

awk在对文本处理之前可做某些操作,这些操作在BEGIN{}中定义,当awk对文本处理完毕之后可做一些扫尾工作,在END{}中定义.
1.在BEGIN{}中可定义标题及一些变量.
2.定义分割符FS

awk ‘BEGIN{命令1;命令2...}/模式/{命令m;命令n}END{命令x;命令y}‘ file
#awl  ‘BEGIN{FS=‘:‘ $5~/root/{print}‘ /etc/passwd
#awk ‘BEGIN{FS=‘:‘ print "用户名"}$3>=500||$3==0{print $1}END{print "end"}‘ /etc/passwd

awk作为和bash一个软件级别,其本身也是一门编程语言,支持高级语言的特性.

1.awk和read读取文件中的行,read只读取一行,读完文本需要利用for循环,awk本身自带循环.
2.awk支持高级编程语言的流程控制,循环语句,函数等功能.

awk支持流程控制if

if语句语法
if(判断){语句1}else if(判断2){语句2}else{语句3}

注:流程控制和循环都需要写入{}中

用if语句实现列出/etc/passwd中不同用户.

awk -F: ‘{if($3==0{print "root usr"} else if($3>=500){print "common usr"} else{print "sys usr"}}‘ /etc/passwd

三目运算符
#awk -F: ‘{print($==0?"root":"not root")}‘ /etc/passwd

awk支持循环语句for-while

while语句语法

while(条件){
语句1
语句2
...
}

demo:将/etc/passwd中root用户行按分隔符分开部分分成不同的行来写.

root:x:0:0:xxxxx:/root/:/bin/bash

root
x
0
0
xxxxx
/root/
/bin/bash

awk -F: ‘$1~/root/{
print "---------------------------------"
i=1
while(i<=NF){print $i ;i++}
}‘ /etc/passwd

当满足某个条件时跳出循环-break

awk -F: ‘{
print "---------------------------------"
i=1
while(i<=NF{
if($1~/shutdown/){break}
print $i,i++}
}‘ /etc/passwd

当遇到next时下面的语句不再执行-next

for循环语法结构

for(i=1;i<n;i++){
语句
}

awk -F: ‘{print "----------------------------"
for(i=1;i<=NF;i++){print $i}
}‘ /etc/passwd

demo:系统内存管理是通过分配页面管理的,对于未写入硬盘的为脏页,反之为干净页.

统计某个进程占用多少脏页,多少干净页

cat /proc/1/smaps | awk ‘/Shard_Clean/{AA +=$2}‘ /Shard_Dirty/{BB +=$2}END{print "clean page:"AA"kb" ;print "dirty pages:"BB"kb" }

awk支持数组,数组定义连续的值,值为元素

1.在awk中,数组的下标不一定非得是数字,所以称散列更合适.
2.在awk中,数组的下标定义为字符串是要用""引起来

定义数组和引用数组
echo ‘‘ | awk ‘{aa[1]=111 aa[2]=222 print aa[1]}‘
echo ‘‘ | awk ‘{aa["a"]=111 aa["b"]=222 print aa["a"]}‘

demo:统计俩个文件中相关联的项目(如统计一个人用身份证办的不同银行卡)

#cat aa
tom:001
bob:002

#cat bb
001:aa
001:bb
002:cc
002:dd

结果集要求
tom:001:aa
tom:001:bb

bob:002:cc
bob:002:dd

现对aa操作用a数组a文件中的值定义数组
aa["$2"]=$0

->可实现
aa[001]=tom:001
aa[002]=bob:002

对bb操作
->此时aa中的$2和bb中的$1是相同的值,引用数组正常
aa[001]=tom:001
aa[002]=bob:002

awk -F: ‘NR==FNR{aa[$2]=$0;next}{print aa[$1":"$2]}‘ aa bb

awk中常用的函数-sub/gsub-length-subsrt

#awk ‘{sub("tom","TOM");print $0}‘ file
#awk ‘{gsub("tom","TOM");print $0}‘ file

demo:系统监控时,利用gnuplot,rrdtool工具需将时间转化为秒数
#LANG=C sar 1 > aa.sar
#date -d ‘12:21:11‘ +%s

length()                           计算字符串长度
substr(‘字符串‘,m,n)           从m位置开始截取n个字符串

注* printf 格式化输出

#awk -F ‘/root/{printf "%s        %s\n",$1,$5}‘ /etc/passwd
#awk -F ‘/root/{printf "20%s          %20s\n"}‘ /etc/passwd

时间: 2024-08-19 06:29:57

流编辑器-awk的相关文章

第十九章 文本处理流编辑器:awk编程

第十九章 文本处理流编辑器:awk编程 名词解释 awk 是一种编程语言,用于linux/unix下对文本和数据进行处理.数据可以来自标准输入(stdin).一个或多个文件.或其它命令的输出.它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大个编程工具.它在命令行中使用,但更多是作为脚本来使用.awk有很多内建的功能,比如:数组.函数等,这是它和C语言的相同之处,灵活性是awk最大的优势. awk命令格式和选项 语法形式 awk [option] 'script'

sed非交互式的流编辑器

sed 非交互式 的 流编辑器 默认处理数据的过程 逐行处理文件,并将处理结果输出屏幕 处理完当前后自动处理下一行,直到文件末行为止 默认是对读入的数据,逐行处理,直到处理完所有末行为止. 加条件改变处理数据的范围 sed [选项]  '[条件]处理动作'  文件列表 条件 处理数据时加条件可以改变 处理数据范围,只处理与条件匹配的数据 若不加条件,会对数据做逐行处理 条件的表示方试:行号 或 /正则表达式/ 2.语法格式 格式1 sed [选项] '处理动作' 文件列表(多个文件之间用空格间隔

SED单行脚本快速参考(Unix 流编辑器)

------------------------------------------------------------------------- SED单行脚本快速参考(Unix 流编辑器) 2005年12月29日 英文标题:USEFUL ONE-LINE SCRIPTS FOR SED (Unix stream editor) 原标题:HANDY ONE-LINERS FOR SED (Unix stream editor) 整理:Eric Pement - 电邮:pemente[at]no

流编辑器 SED 十分钟入门全教程

这里借用一下酷壳网sed博文的图来开题,超赞的-- 1. sed 简介及原理简析 1.1 sed 简介 Sed 是什么?相信很多人都有所了解,sed 全称StreamEDitor 即流编辑器.生于1973年or 1974年by 贝尔实验室的 Lee E. McMahon(已故),是基于交互式编辑器ed("editor", 1971)的脚本功能及更早的qed(quick editor ,1965-1966)(Sed 比 awk 要大那么几岁,所以客官莫急,过几天我们再来详解 awk).S

第十八章 文本处理流编辑器:sed命令

第十八章 文本处理流编辑器:sed命令 名词解释 sed 是一种流编辑器,它是文本处理常用到的工具,能够完美的配合正则表达式使用,功能不同凡响.处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space),接着sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕.接着处理下一行,这样不断重复,直到文件末尾.文件内容并没有改变,除非你使用重定向存储输出.sed主要用来自动编辑一个或多个文件,简化多文件的反复操作,编写转换程序等. sed的选项.命令

文本处理三剑客之sed(流编辑器)

文本处理三剑客之sed(流编辑器) - 行编辑器 把当前处理的行存储在临时缓冲区,称为模式空间,然后把模式空间的内容送往屏幕,一行一行的处理,主要用来编辑一个或者多个文件. - 用法 sed [option]... 'script' inputfile... ###### - 常用选项 -n:不输出模式空间内容到屏幕,即不自动打印 默认会打印模式空间的内容加-n 可以只显示需要打印的行 [root@localhost home]# sed -n '2,3p' /etc/passwd bin:x:

介绍一款优秀的Ansys命令流编辑器PSPad

特色:语法高亮,自动完成,自定义语法定义文件 使用时,按crtl+J可以自动完成. 在输入的命令后按鼠标中键可以显示该命令的解释.在空白处按鼠标中键可 以显示ansys的命令,双击其中的命令就可以自动把命令输入,并且带上各种参数.选中一个文本区域块后按 Tab键可以设置自动对齐缩进. 下面把详细的设置方法奉献给大家: 1.首先安装最新版软件,我用的版本是4.50(2183),完成后运行程序为中文界面,里面包含有ansys的语法文 件. 2.点击"设置"菜单,选择"用户语法&q

【linux_笔记】Linux_sed(流编辑器)基本用法

学习资源来自:www.magedu.com 学习记录过程中难免出现错误,如有发现,还望大神们指出. 示例操作部分有的与历史操作有关,如果先前的示例操作没有执行过的话,可能会有部分示例的操作无法执行.示例仅供参考.(练习题在附录) sed基本用法: sed: Stream EDitor(流编辑器)    行编辑器 (全屏编辑器: vi)    sed: 默认不编辑原文件,仅对模式空间中的数据做处理:而后,处理结束后,将模式空间打印至屏幕:        (模式空间 -- 内存空间) sed [op

流编辑器sed使用总结及利用sed从文本中提取字符串的方法

sed 是一个编辑器,但它与其它大多数编辑器不同.除了不面向屏幕之外,它还是非交互式的,我们常用的vim编辑器则是交互式的. 这意味着必须将要对数据执行的命令插入到命令行或要处 理的脚本中.sed 在一个文件(或文件集)中非交互式.并且不加询问地接收一系列的命令并执行它们.因而,它流经文本就如同水流经溪流一样,因而 sed 恰当地代表了流编辑器,可以对文件或者文件集批量的进行删除 替换 插入 追加等操作. 流编辑器非常适合于执行重复的编辑,这种重复编辑如果由人工完成将花费大量的时间. 其参数可能