awk详解使用用法

awk

流编辑器 适合处理有行有列 比较规则的文本

awk 读入一行,执行一次主输入循环
#awk ‘BEGIN{} {}END{}‘ 文件名称
BEGIN{}处理所有文本之前执行 不想执行可以不加BEGIN
{} 主输入循环
END{} 处理所有文本之后的执行 可选

{}中字符串必须加“” 如果一个字符串不不加引号,会被当作一个变量来处理

Awk读入一行,执行一次括号里面的动作
读入一行,执行一次后面的主输入循环

#awk ‘{}‘ /etc/passwd
#awk 选项 ‘BEGIN{} {} END{}‘ 文件

print语句如果没有参数,只简单输出每个输入行

#cat test2
Hello, world
#awk ‘{ print }‘ test2
Hello, world
awk 程序设计模型
awk 程序由所谓的主输入(main input)循环组成。一个循环称作一个例程。
awk允许你编写两个特殊的例程,他们在任何输入被读取前和所有输入都被读取后执行。他们是与BEGIN和END规则相关的过程。BEGIN和END过程是可选的。

awk ‘BEGIN {print “hello,World”}’

Hello,World
BEGIN模式不需要等待输入,它在第一个输入行读入之前执行。

BEGIN{} 所有文本内容读入之前要执行的命令
{} 主输入循环 用的最多
END{} 所有文本全部读入完成之后执行的命令

print
不跟任何参数,打印awk读入的内容
跟参数:
数字 不要加引号
字符串 必须加引号
变量 没有加引号的字符串

 print  5
 print  a
 print "a"

模式匹配
#cat src1.awk
/[0-9]+/ { print "That is an integer" }
/[A-Za-z]+/ { print "This is a string" }
/^$/ { print "This is a blank line." }

一个特殊的例子:一行文本可以匹配一条或多条规则
#echo 4t | awk -f src1.awk
That is an integer
This is a string

记录和字段

awk假设它的输入是有结构的,而不是一串无规则的字符。默认它将每个输入行作为一条记录,而将由空格或制表符分隔的单词作为字段。连续的多个空格和/或制表符被作为一个分隔符。

记录:以记录分割符分割的字符串
字段:以字段分割符分割的字符串
字段包括在记录里面

默认记录分隔符:\n
默认字段分隔符:单个或多个空格 \tab 或 当\n不是记录分隔符的时候\n是字段分隔符

record 记录
$0 整条记录
NR 记录号 number record
FNR F代表文件 将2文件分开记录行号
RS 输入记录分隔符 record separate
ORS 输出记录分隔符
$1 第一个字段
$2 第二个字段
$...
NF 字段个数
FS 输入字段分隔符
OFS 输出字段分隔符
FILENAME 被处理的文件的名称
,表示的是默认输出字段分隔符 默认是空格

#awk ‘BEGIN{FS=":";OFS=":"}{print $1"("$3")"}‘ /etc/passwd

#awk ‘BEGIN{FS= ":";printf("%-25s %-30s\n", "用户名","uid")}{printf("%-25s %-30s\n",$1,$3)}‘ passwd
用户名 uid
emon 2
lp 4
sync 5
tcpdump 72
xiaomi 1000

手动指定FS的值:

#awk ‘BEGIN{FS=":|="}{print $1}‘ a FS="冒号或等号"
hello
wenjian
bianji
chakan
sousuo

字段的引用和分离

John Robinson 666-555-1111
awk允许使用字段操作符$来指定字段。$后面可以跟着一个数字或者一个变量。
$1表示第一个字段,$2表示第二个字段,$0表示整个输入记录。

#awk ‘{ print $2, $1, $3 }‘ names
Robinson John 666-555-1111

可以使用-F来改变字段分隔符

#awk -F"\t" ‘{ print $2 }‘ names
666-555-1111
#awk -F"\t+" ‘{ print $2 }‘ names
#awk -F"[‘:\t]" ‘{ print $2 }‘ names
任何3个字符之一都可以被解释为字段分隔符

也可以在脚本中指定域分隔符,通过系统变量FS来改变
BEGIN { FS = "," } # comma-delimited fields
{ print $1 "-" $2 }

使用匹配规则

/MA/ { print $1 ", " $6 }

为了避免假警报,可以使用更精确的匹配 ~是匹配的意思
$5 ~ /MA/ { print $1 ", " $6 }
还可以使用!来反转这个规则的意义 !~就是不匹配的意思
$5 !~ /MA/ { print $1 ", " $6 }

表达式:

常量
分成两种:字符串型和数字型
字符串型在表达式中必须用引号括起来
字符串中可以使用转义序列,常用的转义序列有:
\n 换行 \t 水平制表符 \r 回车

变量

x=1
x是变量的名字 =是一个赋值操作符 1是一个数字常量
注意:变量区分大小写,所以x 和X(大写)表示不同的变量
变量名只能由数字字母下划线组成,而且不能以数字开头
变量使用不区分类型,使用前不必初始化
z = "Hello"
z = "Hello" "World"
z = $1
以上几种都是合法的

常用算术操作符:

  • Addition 加
  • Subtraction 减
  • Multiplication awk ‘{print (5+3)*8}‘ passwd 乘
    / Division awk ‘{print (5+3)/8}‘ passwd 除以
    % Modulo 取模 = 取余

$RANDOM 随机取值

echo $[$RANDOM%5] shell 里边用的 第一个$是shell里边的取值 第二个是随机取值它是一个变量

x=1 给x赋值
y=x+1 计算x的值,使它加1,并将结果赋给变量y。
print y 打印y的值。
我们可以将这3个语句减少为两个:
x=1
print x+1
2

常用赋值操作符

++ Add 1 to variable.
-- Subtract 1 from variable.
+= Assign result of addition.
-= Assign result of subtraction.
*= Assign result of multiplication.
/= Assign result of division.
%= Assign result of modulo.
^= Assign result of exponentiation.(取幂)
x++ ++x 都是 x=x+1 x++ ++x 区别在++ x 先加一在算x的值 x++ 先算x值在加
比如awk ‘BEGIN{x=1;print ++x}‘ 这样值是2
awk ‘BEGIN{x=1;print x++}‘ 这样值是1
for (x=1;x<=5;x++) 在for循环中没有区别

x-- --x 都是 x=x-1
x^ 这意思是 x的x次方 x^3 这就是x的3次方

计算文件中空行的数目
#awk ‘/^$/{x++}END{print x}‘ b
8

例如

计算学生的平均成绩
mona 70 77 85 83 70 89
john 85 92 78 94 88 91
andrea 89 90 85 94 90 95
jasper 84 88 80 92 84 82
dunce 64 80 60 60 61 62
ellis 90 98 89 96 96 92

#awk ‘{total=$2+$3+$4+$5;print $1,total/4}‘ b
姓名 0
tom 60
jim 35
lilei 67.75

系统变量:

$0 整条记录
$1 第一个字段
FS 定义字段分隔符,默认为一个空格
OFS 输出的字段分隔符,默认为一个空格
RS 记录分隔符,默认为一个换行符
ORS 输出的记录分隔符,默认为一个换行符
NR 行数
FNR 行数,多文件操作时会重新排序
NF 字段的个数
FILENAME 文件名

关系操作符和布尔操作符

关系操作符

< Less than

Greater than
<= Less than or equal to
= Greater than or equal to
== Equal to
!= Not equal to
~ Matches 匹配
!~ Does not match 不匹配
NF == 5 NF(每个输入记录的字段数)的值和5相比较,如果结果为真,那
么就进行相应的处理,否则不进行处理。
$5 ~ /MA/ {print $1 “,”$6}
注意:关系操作符==和赋值操作符=是不同的
awk与里边只有真和假 0真1假 shell里边正好相反 真的就执行假的就不执行

获取文件夹中文件总大小

ll | awk ‘{sum=sum+$5}END{print sum}‘
4521807078

格式化打印
printf ( format-expression [, arguments] )
c ASCII 字符
d 十进制整数
f 浮点格式
s 字符串
x 无符号十六进制

常用举例:

语法 %-width.precision format-specifier
printf(" %d \t %s \n ", $5 , $8 )
printf("|%10s|\n", "hello") 右对齐
printf("|%-10s|\n", "hello") 左对齐
printf("%.f\n", 5, 3, myvar) 宽度5 精度3 打印myvar

循环

while 循环
while (condition)
action

例:
i = 1
while ( i <= 4 ) {
print $i
++i
}

do 循环 先
do
action
while (condition)

例:
BEGIN {
do {
++x
print x
} while ( x <= 4 )
}

for 循环
for ( set_counter ; test_counter ; increment_counter )
action
for(变量初始化;变量变化范围-条件;增幅)

for(num=1;num<=9;num++) print num

num=1 //初始化
num<9条件成功 //判断
num=1 //执行循环体
打印1 //执行循环体

num=2 //num++
条件成功 //判断
2 //执行循化 体

先执行循环体在执行num++
一直循环下去,直到条件不成功,退出循环

例如:
从第一个字段到最后一个字段
for ( i = 1; i <= NF; i++ )
print $i

从最后一个字段到第一个字段
for ( i = NF; i >= 1; i-- )
print $i

用for实现求平均值
total = 0
for (i = 2; i <= NF; ++i)
#total = $2 + $3 + $4 + $5 + $6
#avg = total / 5
或者用下方在这个
total += $i
avg = total / (NF - 1)

awk重定向
#awk -F : ‘{print $1 >> "/tmp/awktest"}‘ /etc/passwd

awk管道
#awk -F : ‘{print $1 | "sort"}‘ /etc/passwd

原文地址:http://blog.51cto.com/13730901/2112470

时间: 2024-11-14 11:10:31

awk详解使用用法的相关文章

linux sed&awk详解

sed sed为文本处理三剑客之一.本身就是一个管道命令,可以将文件进行增加,修改,删除,选取等操作. 格式:sed [-nrefi] [command] "文本字符串" 选项: -r: 支持扩展正则表达式: -n: 静默模式:(sed有个模式空间和保持空间,默认sed会将执行的结果保存到模式空间里面,而模式空间默认情况是输出在屏幕上,加了-n,则阻止将模式空间的内容输出到屏幕上) -f:/path/to/script_file:从指定的文件中读取脚本并运行 -e script1 -e

linux awk详解与应用

文章来自于本人个人博客: linux awk详解与应用 1.awk awk是一个强大的文本分析工具,它可以通过分析文本来生成一个数据报告.它的原理就是读取每行的输入,然后按照分隔符切分(默认是空格),再进行定制计算. awk '{print $1}' /etc/passwd   #打印出passwd文件的所有行的第一列 这是awk的基础语法,在awk中$n代表列数,即$1--第一列,$2---第二列....,但是$0代表整行 接下来我们按照指定的分隔符打印数据: awk -F ':' '{pri

结构体定义 typedef struct 用法详解和用法小结

typedef是类型定义的意思.typedef struct 是为了使用这个结构体方便.具体区别在于:若struct node {}这样来定义结构体的话.在申请node 的变量时,需要这样写,struct node n;若用typedef,可以这样写,typedef struct node{}NODE; .在申请变量时就可以这样写,NODE n;区别就在于使用时,是否可以省去struct这个关键字. 第三篇:struct和typedef struct 分三块来讲述:1 首先:在C中定义一个结构体

linux sed,awk详解

sed命令:sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕.接着处理下一行,这样不断重复,直到文件末尾.文件内容并没有 改变,除非你使用重定向存储输出.Sed主要用来自动编辑一个或多个文件:简化对文件的反复操作:编写转换程序等.sed使用参数[[email protected] ~]# sed [-nefr] [动作]-n :使

Linux文本处理三剑客之awk详解

前言 awk是一款强大的报告生成器,不同于sed和grep,它的侧重点是如何把文本信息更好的展示出来,常用与统计和格式化输出.awk相当于微型的shell,有着自己一套语法结构,例如:循环结构,数组,条件判断,函数,内置变量等功能.处理对象一般纯文本文件或纯文本信息. 用法详解 基本语法 awk [options] 'program' file file ... awk [options] 'PATTERN{action}' file file ... -F CHAR:输入分隔符 awk的输出

ANDROID application详解与用法

1:Application是什么? Application和Activity,Service一样,是android框架的一个系统组件,当android程序启动时系统会创建一个 application对象,用来存储系统的一些信息.通常我们是不需要指定一个Application的,这时系统会自动帮我们创建,如果需要创建自己 的Application,也很简单创建一个类继承 Application并在manifest的application标签中进行注册(只需要给Application标签增加个nam

Linux下Awk详解(转载)

什么是Awk Awk是一种小巧的编程语言及命令行工具.(其名称得自于它的创始人Alfred Aho.Peter Weinberger 和 Brian Kernighan姓氏的首个字母).它非常适合服务器上的日志处理,主要是因为Awk可以对文件进行操作,通常以可读文本构建行. 我说它适用于服务器是因为日志文件,转储文件(dump files),或者任意文本格式的服务器终止转储到磁盘都会变得很大,并且在每个服务器你都会拥有大量的这类文件.如果你经历过这样的情境--在没有像Splunk或者其他等价的工

linux基础学习第二十二天之AWK详解

内容: 1.awk输出(print.printf) 2.awk变量(内建变量和定义变量) 3.awk数组 4.awk重定向输出 5.awk操作符 6.awk常见模式类型 7.awk控制及循环语句 8.awk内置函数 awk:(其名称得自于它的创始人 Alfred Aho .Peter Weinberger 和 Brian Kernighan 姓氏的首个字母) awk是一款强大的报告生成器,不同于sed和grep,它的侧重点是如何把文本信息更好的展示出来,常用与统计和格式化输出. awk相当于微型

awk详解

一.awk简介 awk的意思是报告生成器,能根据输入信息,把信息格式化后显示,继而出现new awk(nawk)在windows上实现,gawk,awk实现在linux上.awk是一种编程语言,在linux/unix下对文本和数据进行处理,是一款强大编程工具.在命令行中使用,更多作为脚本来使用. awk处理文件和数据的方式:逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行操作.如果没有指定处理动作,则把匹配行打印,如果没有指定模式,则所有行都处理.gawk是awk的GN