`
yuanlanjun
  • 浏览: 1187446 次
文章分类
社区版块
存档分类
最新评论

shell脚本系列-awk用法总结

 
阅读更多

awk的用法

a w k语言的最基本功能是在文件或字符串中基于指定规则浏览和抽取信息

调用awk

有三种方式调用a w k

第一种是命令行方式,如:

awk –F : ‘commands’ input-files

第二种方法是将所有a w k命令插入一个文件,并使a w k程序可执行,然后用a w k命令作为脚本的首行,以便通过键入脚本名称来调用它。

第三种方式是将所有的a w k命令插入一个单独文件,然后调用:

awk –f awk-script-file input-files

awk脚本

模式和动作

在命令中调用a w k时,a w k脚本由各种操作和模式组成。模式包括两个特殊字段B E G I NE N D

使用B E G I N语句设置计数和打印头。B E G I N语句使用在任何文本浏览动作之前。E N D语句用来在a w k完成文本浏览动作后打印输出文本总数和结尾状态标志。

实际动作在大括号{ }内指明。

域和记录

$ 0,意即所有域

确保整个a w k命令用单引号括起来。

确保命令内所有引号成对出现。

确保用花括号括起动作语句,用圆括号括起条件语句。

awk中的正则表达式

+ 使用+匹配一个或多个字符。

匹配模式出现频率。例如使用/X Y?Z/匹配X Y ZY Z

awk '{if($4~/Brown/) print $0}' tab2

等效于

awk '$0 ~ /Brown/' tab2

内置变量

awk '{print NF,NR,$0}END{print FILENAME}' tab1

NF 域的总数

NR已经读取的记录数

FILENAME

awk '{if(NR>0 && $2~/JLNQ/) print $0}END{print FILENAME}' tab1

显示文件名

echo "/app/oracle/ora_dmp/lisx/tab1" | awk -F/ '{print $NF}'

定义域名

awk '{owner=$2;number=$3;if(owner~/SYSADMIN/ && number!=12101)print $0}END{print FILENAME}' tab1

awk 'BEGIN{NUM1=7}{if($1<=NUM1) print $0}END{print FILENAME}' tab1

当在a w k中修改任何域时,重要的一点是要记住实际输入文件是不可修改的,修改的只是保存在缓存里的a w k复本

awk 'BEGIN{NUM1=7}{if($1<=NUM1) print $1+2,$2,$3+100}END{print FILENAME}' tab1

只打印修改部分:用{}

awk 'BEGIN{NUM1=7}{if($1<=NUM1){$2="ORACLE"; print $0}}END{print "filename:"FILENAME}' tab1

可以创建新的域

awk 'BEGIN{NUM1=7;print "COL1"tCOL2"tCOL3"tCOL4"}{if($1<=NUM1){$4=$1*$3;$2="ORACLE"; print $0}}END{print "filename:"FILENAME}' tab1

打印总数:

awk 'BEGIN{NUM1=7;print "COL1"tCOL2"tCOL3"tCOL4"}{if($1<=NUM1){tot+=$3;$4=$1*$3;$2="ORACLE"; print $0}}END{print "filename:"FILENAME "total col3:" tot}' tab1

使用此模式打印文件名及其长度,然后将各长度相加放入变量t o t中。

ls -l | awk '/^[^d]/ {print$9""t"$5} {tot+=$5}END{print "total KB:" tot}'

内置字符串函数

gsub字符要用引号,数字不用

awk 'gsub(/12101/,"hello") {print $0} END{print FILENAME}' tab1

awk 'gsub(/12101/,3333) {print $0} END{print FILENAME}' tab1

index

awk '{print index($2,"D")""t";print $0}' tab1

awk '{print index($2,"D")""t" $0}' tab1

length

awk '{print length($2)""t" $0}' tab1

ma

awk '{print match($2,"M")""t" $0}' tab1

split

awk '{print split($2,new_array,"_")""t" $0}' tab1

sub 替换成功返回1,失败返回0

awk '{print sub(/SYS/,"oracle",$2)""t" $0}' tab1

substr

awk '{print substr($2,1,3)""t" $0}' tab1

s h e l l中向a w k传入字符串

echo "Stand-by" | awk '{print length($0)""t"$0}'

8 Stand-by

file1="tab1"

cat $file1 | awk '{print sub(/ADMIN/,"sss",$2)""t"$0}'

字符串屏蔽序列

" b 退格键 " t t a b

" f 走纸换页 " d d d 八进制值

" n 新行 " c 任意其他特殊字符,例如" "为反斜线符号

" r 回车键

awk printf修饰符

- 左对齐

Wi d t h 域的步长,用0表示0步长

. p r e c 最大字符串长度,或小数点右边的位数

如果用格式修饰输出,要指明具体的域,程序不会自动去分辨

awk '{printf "%-2d %-10s %d"n", $1,$2,$3}' tab1

输出结果

9SYSADMIN 12101

9SYSADMIN 12101

14 SYSADMIN 121010000012002

9SYSADMIN 12101

2JLNQ 12101

2JLNQ 12101

7SYSADMIN 12101

7SYSADMIN 12101

6ac_ds_e_rr_mr 13333

向一行a w k命令传值

awk 'BEGIN{SYS="SYSADMIN"}{if($2==SYS) printf "%-2d %-10s %d"n", $1,$2,$3}' tab1

在动作后面传入

awk '{if($2==SYS) printf "%-2d %-10s %d"n", $1,$2,$3}' SYS="SYSADMIN" tab1

awk脚本文件

SED用法

sed怎样读取数据

s e d从文件的一个文本行或从标准输入的几种格式中读取数据,将之拷贝到一个编辑缓冲区,然后读命令行或脚本的第一条命令,并使用这些命令查找模式或定位行号编辑它。重复此过程直到命令结束。

调用s e d有三种方式

使用s e d命令行格式为:

sed [选项] s e d命令 输入文件。

记住在命令行使用s e d命令时,实际命令要加单引号。s e d也允许加双引号。

使用s e d脚本文件,格式为:

sed [选项] -f sed脚本文件 输入文件

要使用第一行具有s e d命令解释器的s e d脚本文件,其格式为:

s e d脚本文件[选项] 输入文件

使用s e d在文件中定位文本的方式

x x为一行号,如1

x , y 表示行号范围从xy,如25表示从第2行到第5

/ p a t t e r n / 查询包含模式的行。例如/ d i s k //[a-z]/

/ p a t t e r n / p a t t e r n / 查询包含两个模式的行。例如/ d i s k / d i s k s /

p a t t e r n / , x 在给定行号上查询包含模式的行。如/ r i b b o n / , 3

x , / p a t t e r n / 通过行号和模式查询匹配行。3 , / v d u /

x , y ! 查询不包含指定行号x和y的行。1 , 2 !

sed编辑命令

p 打印匹配行

= 显示文件行号

a" 在定位行号后附加新文本信息

i" 在定位行号后插入新文本信息

d 删除定位行

c" 用新文本替换定位文本

s 使用替换模式替换相应模式

r 从另一个文件中读文本

w 写文本到一个文件

q 第一个模式匹配完成后推出或立即推出

l 显示与八进制A S C I I代码等价的控制字符

{ } 在定位行执行的命令组

n 从另一个文件中读文本下一行,并附加在下一行

g 将模式2粘贴到/pattern n/

y 传送字符

n 延续到下一输入行;允许跨行的模式匹配语句

sed编程举例

打印单行 sed -n '2p' quo*

打印范围 sed -n '1,3p' quote.txt

打印有此模式的行 sed -n '/disco/'p quote.txt

使用模式和行号进行查询 sed -n '4,/The/'p quote.txt

sed -n '1,/The/'p quote.txt 会打印所有记录?

用.*代表任意字符 sed -n '/.*ing/'p quote.txt

打印行号 sed -e '/music/'= quote.txt或sed -e '/music/=' quote.txt

如果只打印行号及匹配行,必须使用两个s e d命令,并使用e选项。

第一个命令打印模式

匹配行,第二个使用=选项打印行号,格式为sed -n -e /pattern/p -e /pattern/=

sed -n -e '/music/p' -e '/music/'= quote.txt

先打印行号,再打印匹配行

sed -n -e '/music/=' -e '/music/'p quote.txt

替换

sed 's/The/Wow!/' quote.txt

保存到文件

sed '1,2 w filedt' quote.txt

读取文件,在第一行后面读取

sed '1 r sedex.txt' quote.txt

替换字符系列

如果变量x含有下列字符串:

x="Department+payroll%Building G"

要实现以下转换:

+ to 'of'

% to located

语句: echo $x | sed 's/"+/ of /g' | sed 's/"%/ located /g'

awk编程举例


1、awk'/101/'file显示文件file中包含101的匹配行。
awk'/101/,/105/'file
awk'$1==5'file
awk'$1=="CT"'file注意必须带双引号
awk'$1*$2>100'file
awk'$2>5&&$2<=15'file
2、awk'{printNR,NF,$1,$NF,}'file显示文件file的当前记录号、域数和每一行的第一个和最后一个域。
awk'/101/{print$1,$2+10}'file显示文件file的匹配行的第一、二个域加10。
awk'/101/{print$1$2}'file
awk'/101/{print$1$2}'file显示文件file的匹配行的第一、二个域,但显示时域中间没有分隔符。
3、df|awk'$4>1000000'通过管道符获得输入,如:显示第4个域满足条件的行。
4、awk-F"|"'{print$1}'file按照新的分隔符“|”进行操作。
awk'BEGIN{FS="[:/t|]"}
{print$1,$2,$3}' file通过设置输入分隔符(FS="[:/t|]")修改输入分隔符。

Sep="|"
awk-F$Sep'{print$1}'file按照环境变量Sep的值做为分隔符。
awk-F'[:/t|]''{print$1}'file按照正则表达式的值做为分隔符,这里代表空格、:、TAB、|同时做为分隔符。
awk-F'[][]''{print$1}'file按照正则表达式的值做为分隔符,这里代表[、]
5、awk-fawkfile file通过文件awkfile的内容依次进行控制。
catawkfile
/101/{print"/047Hello!/047"}--遇到匹配行以后打印'Hello!'./047代表单引号。
{print$1,$2}--因为没有模式控制,打印每一行的前两个域。
6、awk'$1~/101/{print$1}'file显示文件中第一个域匹配101的行(记录)。
7、awk'BEGIN{OFS="%"}
{print$1,$2}'file通过设置输出分隔符(OFS="%")修改输出格式。
8、awk'BEGIN{max=100;print"max="max}BEGIN表示在处理任意行之前进行的操作。
{max=($1>max?$1:max);print$1,"Nowmaxis"max}'file取得文件第一个域的最大值。
(表达式1?表达式2:表达式3相当于:
if(表达式1)
表达式2
else
表达式3
awk'{print($1>4?"high"$1:"low"$1)}'file
9、awk'$1*$2>100{print$1}'file显示文件中第一个域匹配101的行(记录)。
10、awk'{$1=='Chi'{$3='China';print}'file找到匹配行后先将第3个域替换后再显示该行(记录)。
awk'{$7%=3;print$7}'file将第7域被3除,并将余数赋给第7域再打印。
11、awk'/tom/{wage=$2+$3;printfwage}'file找到匹配行后为变量wage赋值并打印该变量。
12、awk'/tom/{count++;}
END{print"tomwasfound"count"times"}'fileEND表示在所有输入行处理完后进行处理。
13、awk'gsub(//$/,"");gsub(/,/,"");cost+=$4;
END{print"Thetotalis$"cost>"filename"}'filegsub函数用空串替换$和,再将结果输出到filename中。
123$1,200.00
123$2,300.00
123$4,000.00

awk'{gsub(//$/,"");gsub(/,/,"");
if($4>1000&&$4<2000)c1+=$4;
elseif($4>2000&&$4<3000)c2+=$4;
elseif($4>3000&&$4<4000)c3+=$4;
elsec4+=$4;}
END{printf"c1=[%d];c2=[%d];c3=[%d];c4=[%d]/n",c1,c2,c3,c4}"'file
通过if和elseif完成条件语句

awk'{gsub(//$/,"");gsub(/,/,"");
if($4>3000&&$4<4000)exit;
elsec4+=$4;}
END{printf"c1=[%d];c2=[%d];c3=[%d];c4=[%d]/n",c1,c2,c3,c4}"'file
通过exit在某条件时退出,但是仍执行END操作。
awk'{gsub(//$/,"");gsub(/,/,"");
if($4>3000)next;
elsec4+=$4;}
END{printf"c4=[%d]/n",c4}"'file
通过next在某条件时跳过该行,对下一行执行操作。


14、awk'{printFILENAME,$0}'file1file2file3>fileall把file1、file2、file3的文件内容全部写到fileall中,格式为
打印文件并前置文件名。
15、awk'$1!=previous{close(previous);previous=$1}
{printsubstr($0,index($0,"")+1)>$1}'fileall把合并后的文件重新分拆为3个文件。并与原文件一致。
16、awk'BEGIN{"date"|getlined;printd}'通过管道把date的执行结果送给getline,并赋给变量d,然后打印。
17、awk'BEGIN{system("echo/"Inputyourname://c/"");getlined;print"/nYournameis",d,"/b!/n"}'
通过getline命令交互输入name,并显示出来。
awk'BEGIN{FS=":";while(getline<"/etc/passwd">0){if($1~"050[0-9]_")print$1}}'
打印/etc/passwd文件中用户名包含050x_的用户名。

18、awk'{i=1;while(i<NF){printNF,$i;i++}}'file通过while语句实现循环。
awk'{for(i=1;i<NF;i++){printNF,$i}}'file通过for语句实现循环。
typefile|awk-F"/"'
{for(i=1;i<NF;i++)
{if(i==NF-1){printf"%s",$i}
else{printf"%s/",$i}}}'显示一个文件的全路径。
用for和if显示日期
awk'BEGIN{
for(j=1;j<=12;j++)
{flag=0;
printf"/n%d月份/n",j;
for(i=1;i<=31;i++)
{
if(j==2&&i>28)flag=1;
if((j==4||j==6||j==9||j==11)&&i>30)flag=1;
if(flag==0){printf"%02d%02d",j,i}
}
}
}'
19、在awk中调用系统变量必须用单引号,如果是双引号,则表示字符串
Flag=abcd
awk'{print'$Flag'}'结果为abcd
awk'{print"$Flag"}'结果为$Flag

分享到:
评论

相关推荐

    UNIX命令及SHELL编程

    16_基础shell编程-shell脚本介绍.PDF 17_基础shell编程-条件测试.PDF 18_基础shell编程-控制流结构.PDF 19_基础shell编程-shell 函数.PDF 20_基础shell编程-向脚本传递参数.PDF 21_基础shell编程-创建屏幕输出...

    Shell脚本中awk指令的用法

    今天小编就为大家分享一篇关于Shell脚本中awk指令的用法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    shell编程指南,shell脚本,本书共分五部分全。grep家族,sed,AWK,正则表达式,tr用法

    第16章 shell脚本介绍 151 第17章 条件测试 154 第18章 控制流结构 160 第19章 shell函数 202 第20章 向脚本传递参数 224 第21章 创建屏幕输出 236 第22章 创建屏幕输入 252 第23章 调试脚本 274 第24章 shell嵌入...

    Shell脚本专家指南

    《Shell脚本专家指南》旨在为Linux、Unix以及OSx系统管理员提供短小精悍且功能强大的shell实现解决方案,教会读者如何使用现有调试器调试shell脚本。全书分为3个部分:脚本技术基础、系统交互和高级技术、有用的脚本...

    LINUX与UNIX SHELL编程指南

    016-shell脚本介绍.PDF 017-条件测试.PDF 018-控制流结构.PDF 019-shell 函数.PDF 020-向脚本传递参数.PDF 021-创建屏幕输出.PDF 022-创建屏幕输入.PDF 023-调试脚本.PDF 024-shell嵌入命令.PDF 025-深入讨论(左尖...

    shell帮助文档

    16-shell脚本介绍.pdf 17-条件测试.pdf 18-控制流结构.pdf 19-shell 函数.pdf 20-向脚本传递参数.pdf 21-创建屏幕输出.pdf 22-创建屏幕输入.pdf 23-调试脚本.pdf ................. ................. 30-常用shell...

    shell脚本–awk的用法

    1. awk的用法 语法格式:awk [选项] ‘指令’ 操作文件 常用选项:-F 指定分隔符,分隔符用””引起来 -v:var=value在awk程序开始之前指定一个值valu给变量var,这些变量值用于awk程序的BEGIN快 -f:后面跟一个保存...

    Linux shell脚本 精华中文版

    016_基础shell编程_shell脚本介绍.pdf 017_条件测试_test_expr.pdf 018_控制流结构_if_for_while_case_util_break_continue.pdf 019_Shell函数.pdf 020_向脚本传递参数_shift_getops.pdf 021_创建屏幕输出_...

    Advanced Bash-Scripting Guide <>

    使用export 命令传递一个变量到一个内嵌awk 的脚本中 11-19. 使用getopts 命令来读取传递给脚本的选项/参数. 11-20. "Including"一个数据文件 11-21. 一个没什么用的,source 自身的脚本 11-22. exec 的效果 11-23. ...

    shell脚本详解

    第16章_shell脚本介绍; 第17章_条件测试; 第18章_控制流结构; 第19章_shell函数; 第20章_向脚本传递参数; 第21章_创建屏幕输出; 第22章_创建屏幕输入; 第23章_调试脚本; 第24章_shell嵌入命令; 第25章_深入...

    shell教程-30章,下了之后会让你大吃一惊,相当好

    16.1 使用shell脚本的原因 151 16.2 脚本内容 151 16.3 运行一段脚本 152 16.4 小结 153 第17章 条件测试 154 17.1 测试文件状态 154 17.2 测试时使用逻辑操作符 155 17.3 字符串测试 155 17.4 测试数值 156 17.5 ...

    shell脚本入门教程

    资料是本人参加一个培训机构的时候老师给的,主要内容是shell脚本编写包括正则表达式、AWK、SED的用法,后续还有一些资料继续上传,您的支持是我最大的动力

    利用Shell脚本循环读取文件中每一行的方法详解

    本文主要给大家介绍了关于使用Shell脚本循环读取文件每一行的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 一、使用for循环 for line in `cat filename` do echo $line done ...

    UNIX shell 编程指南

    保证shell脚本执行唯一性 用一条命令处理分别改变文件和文件夹的权限 unix时间戳与系统时间相互转换 awk的学习 保护自己编写的shell程序 农行全国集中版代发工资shell程序 Shell程序设计的流程控制 身份证升位shell...

    绝版经典 LINUX与UNIX SHELL编程指南 PDF 高清版 [16.3M]

    第十五章 小结 第四部分 基础SHELL编程 第十六章 SHELL脚本介绍 第十七章 条件测试 第十八章 控制流结构 第十九章 SHELL函数 第二十章 向脚本传递参数 第二一章 创建屏幕输出 第二二章 创建屏幕输入 第二三...

    shell最全基础2020年入门—从熟悉grep、sed、awk开始

    文章目录前言一、什么是shellshell脚本大白话二、shell常用操作三、文本处理三剑客 — 搜索工具grep1.什么是grep2.格式3.主要参数4.pattern正则表达式主要参数:5. grep使用实例四、文本处理三剑客 — 流编辑器sed1....

    Linux高级bash编程

    非官方的Shell脚本风格 33. 杂项 33.1. 交互式和非交互式的shells和脚本 33.2. Shell 包装 33.3. 测试和比较: 另一种方法 33.4. 递归 33.5. 彩色脚本 33.6. 优化 33.7. 各种小技巧 33.8. 安全话题 ...

    shell 编程指南pdf

    16.1 使用shell脚本的原因 151 16.2 脚本内容 151 16.3 运行一段脚本 152 16.4 小结 153 第17章 条件测试 154 17.1 测试文件状态 154 17.2 测试时使用逻辑操作符 155 17.3 字符串测试 155 17.4 测试数值 156 17.5 ...

Global site tag (gtag.js) - Google Analytics