- 浏览: 166884 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
abc08010051:
简单明了,非常不错
java.lang.Thread.State类详解 -
tenderlitch:
jdk api文档里面的描述...
set闲聊 -
xmind:
图不错,收藏之。
图中Thread.wait()改用Objec ...
java.lang.Thread.State类详解 -
lahvey:
因为你的$VALUE值是“sed.txt”,并不是这个文件的内 ...
条件控制(test,expr……) -
tomotoboy:
thanks
tr用法
awk
调用awk有三种方式调用awk,第一种是命令行方式,如:
这里,commands是真正的awk命令。上面例子中,-F域分隔符]是可选的,因为a w k使用空格作为缺省的域分隔符,因此如果要浏览域间有空格的文本,不必指定这个选项,但如果要浏览诸如 passwd文件,此文件各域以冒号作为分隔符,则必须指明- F选项:
第三种方式是将所有的awk命令插入一个单独文件,然后调用:
模式和动作
任何awk语句都由模式和动作组成。在一个awk脚本中可能有许多语句。模式部分决定动作语句何时触发及触发事件。处理即对数据进行的操作。如果省略模式部分,动作将时刻保持执行状态。模式可以是任何条件语句或复合语句或正则表达式。模式包括两个特殊字段BEGIN和END。使用BEGIN语句设置计数和打印头。BEGIN语句使用在任何文本浏览动作之前,之后文本浏览动作依据输入文件开始执行。 END语句用来在awk完成文本浏览动作后打印输出文本总数和结尾状态标志。如果不特别指明模式, awk总是匹配或打印行数。实际动作在大括号{ }内指明。动作大多数用来打印,但是还有些更长的代码诸如 if和循环(looping)语句及循环退出结构。如果不指明采取动作, awk将打印出所有浏览出来的记录。
域和记录
awk执行时,其浏览域标记为$1,$2 . . . $n。这种方法称为域标识。使用这些域标识将更容易对域进行进一步处理。使用$1,$3表示参照第1和第3域,注意这里用逗号做域分隔。如果希望打印一个有5个域的记录的所有域,不必指明 $1,$2,$3,$4 ,$5,可使用$0,意即所有域。awk浏览时,到达一新行,即假定到达包含域的记录末尾,然后执行新记录下一行的读动作,并重新设置域分隔。注意执行时不要混淆符号$和shell提示符$,它们是不同的。
打印所有域的信息
抽取第一域,并打印出来:
打印第一域、第三域
打印信息头和信息尾
如果第一个域等于tomotoboy
如果行的域中包含tomotoboy就打印它
不匹配
行首
打印行首包含to的行
AND
打印第一域为tomotoboy,第三域为Aug的行
注意区分“=”与“==”,获得两种截然不同的结果
awk内置变量
awk内置字符串函数
awk内置字符串函数,awk又很多字符处理函数,这里以length为例
如果第一域的长度大于7就输出
字符串屏蔽序列
使用字符串或正则表达式时,有时需要在输出中加入一新行或查询一元字符。打印一新行时,(新行为字符\n) ,给出其屏蔽序列,以不失其特殊含义,用法为在字符串前加入反斜线。例如使用\n强迫打印一新行。如果使用正则表达式,查询花括号({ }) ,在字符前加反斜线,如/ \ { /,将在awk中失掉其特殊含义。
printf
printf修饰符,prinf基本域C语言的printf相同下面开始举例
awk数组
在上面的例子中,split返回数组myarray下标数。实际上myarray数组为:
myarray[1]=123
myarray[2]=456
myarray[3]=789
数组使用前,不必定义,也不必指定数组元素个数。经常使用循环来访问数组。下面是一种循环类型的基本结构:
For (element in array) print array[element]
对于记录“123#456#789” ,先使用split函数划分它,再使用循环打印各数组元素。操作脚本如下:
要运行脚本,使用/dev/null作为输入文件。
小结
awk语言学起来可能有些复杂,但使用它来编写一行命令或小脚本并不太难。awk是shell编程的一个重要工具。在shell命令或编程中,虽然可以使用awk强大的文本处理能力,但是并不要求你成为这方面的专家
调用awk有三种方式调用awk,第一种是命令行方式,如:
awk [-F field-separator] 'commands' input-file(s)
这里,commands是真正的awk命令。上面例子中,-F域分隔符]是可选的,因为a w k使用空格作为缺省的域分隔符,因此如果要浏览域间有空格的文本,不必指定这个选项,但如果要浏览诸如 passwd文件,此文件各域以冒号作为分隔符,则必须指明- F选项:
awk -F: 'commands' input-file第二种方法是将所有a w k命令插入一个文件,并使 a w k程序可执行,然后用a w k命令解释器作为脚本的首行,以便通过键入脚本名称来调用它。
第三种方式是将所有的awk命令插入一个单独文件,然后调用:
awk -f awk_script_ file input_file(s)- f选项指明在文件awk_script_ file中的a w k脚本,input_file(s)是使用awk进行浏览的文件名。
模式和动作
任何awk语句都由模式和动作组成。在一个awk脚本中可能有许多语句。模式部分决定动作语句何时触发及触发事件。处理即对数据进行的操作。如果省略模式部分,动作将时刻保持执行状态。模式可以是任何条件语句或复合语句或正则表达式。模式包括两个特殊字段BEGIN和END。使用BEGIN语句设置计数和打印头。BEGIN语句使用在任何文本浏览动作之前,之后文本浏览动作依据输入文件开始执行。 END语句用来在awk完成文本浏览动作后打印输出文本总数和结尾状态标志。如果不特别指明模式, awk总是匹配或打印行数。实际动作在大括号{ }内指明。动作大多数用来打印,但是还有些更长的代码诸如 if和循环(looping)语句及循环退出结构。如果不指明采取动作, awk将打印出所有浏览出来的记录。
域和记录
awk执行时,其浏览域标记为$1,$2 . . . $n。这种方法称为域标识。使用这些域标识将更容易对域进行进一步处理。使用$1,$3表示参照第1和第3域,注意这里用逗号做域分隔。如果希望打印一个有5个域的记录的所有域,不必指明 $1,$2,$3,$4 ,$5,可使用$0,意即所有域。awk浏览时,到达一新行,即假定到达包含域的记录末尾,然后执行新记录下一行的读动作,并重新设置域分隔。注意执行时不要混淆符号$和shell提示符$,它们是不同的。
打印所有域的信息
/home/l/g/tomotoboy >who liuzk423 pts/6 Jul 20 08:27 (219.245.104.240) tomotoboy pts/16 Aug 7 23:33 (219.221.98.71) liuqingaihn pts/21 Aug 7 23:10 (116.29.229.116) guise pts/35 Aug 7 21:13 (58.41.162.27) uyty pts/38 Aug 7 22:09 (p3213-ipbf803souka.saitama.ocn.ne.jp) yagamil pts/46 Aug 7 20:48 (199.40.206.191) /home/l/g/tomotoboy >who | awk '{print $0}' liuzk423 pts/6 Jul 20 08:27 (219.245.104.240) tomotoboy pts/16 Aug 7 23:33 (219.221.98.71) liuqingaihn pts/21 Aug 7 23:10 (116.29.229.116) guise pts/35 Aug 7 21:13 (58.41.162.27) uyty pts/38 Aug 7 22:09 (p3213-ipbf803souka.saitama.ocn.ne.jp) yagamil pts/46 Aug 7 20:48 (199.40.206.191)
抽取第一域,并打印出来:
/home/l/g/tomotoboy >who|awk '{print $1}' liuzk423 tomotoboy liuqingaihn guise uyty yagamil
打印第一域、第三域
/home/l/g/tomotoboy >who | awk '{print $1"\t"$3}' liuzk423 Jul tomotoboy Aug liuqingaihn Aug guise Aug uyty Aug yagamil Aug
打印信息头和信息尾
/home/l/g/tomotoboy >who | awk 'BEGIN {print "--------BEGIN-------\n"} {print $1"\t"$3} END {print "----------END-------"}' --------BEGIN------- liuzk423 Jul tomotoboy Aug liuqingaihn Aug guise Aug uyty Aug kenhq Aug yagamil Aug ----------END-------
如果第一个域等于tomotoboy
/home/l/g/tomotoboy >who | awk '{if ($1~/tomotoboy/) print $0}' tomotoboy pts/16 Aug 7 23:33 (219.221.98.71)
如果行的域中包含tomotoboy就打印它
/home/l/g/tomotoboy >who | awk '$0 ~/tomotoboy/' tomotoboy pts/16 Aug 7 23:33 (219.221.98.71)
不匹配
/home/l/g/tomotoboy >who | awk '{if ($1!~/tomotoboy/) print $0}' liuzk423 pts/6 Jul 20 08:27 (219.245.104.240) uyty pts/38 Aug 7 22:09 (p3213-ipbf803souka.saitama.ocn.ne.jp) kenhq pts/40 Aug 7 23:46 (116.77.50.7) yagamil pts/46 Aug 7 20:48 (199.40.206.191) /home/l/g/tomotoboy >who | awk '$0 !~/tomotoboy/' liuzk423 pts/6 Jul 20 08:27 (219.245.104.240) liuqingaihn pts/21 Aug 7 23:54 (116.29.229.116) uyty pts/38 Aug 7 22:09 (p3213-ipbf803souka.saitama.ocn.ne.jp) kenhq pts/40 Aug 7 23:46 (116.77.50.7) yagamil pts/46 Aug 7 20:48 (199.40.206.191)
行首
打印行首包含to的行
/home/l/g/tomotoboy >who | awk '/^to/' tomotoboy pts/16 Aug 7 23:33 (219.221.98.71)
AND
打印第一域为tomotoboy,第三域为Aug的行
/home/l/g/tomotoboy >who | awk '{if ($1=/tomotoboy/ && $2=/Aug/) print $0}' awk: syntax error near line 1 awk: illegal statement near line 1 /home/l/g/tomotoboy >who | awk '{if ($1~/tomotoboy/ && $3~/Aug/) print $0}' tomotoboy pts/16 Aug 7 23:33 (219.221.98.71)
注意区分“=”与“==”,获得两种截然不同的结果
/home/l/g/tomotoboy >who | awk '{if ($1="tomotoboy" && $3="Aug") print $0}' tomotoboy pts/6 Aug 20 08:27 (219.245.104.240) tomotoboy pts/16 Aug 7 23:33 (219.221.98.71) tomotoboy pts/21 Aug 8 00:05 (116.29.229.116) tomotoboy pts/35 Aug 8 00:05 (116.29.229.116) tomotoboy pts/38 Aug 7 22:09 (p3213-ipbf803souka.saitama.ocn.ne.jp) tomotoboy pts/40 Aug 7 23:46 (116.77.50.7) tomotoboy pts/46 Aug 7 20:48 (199.40.206.191)
/home/l/g/tomotoboy >who | awk '{if ($1=="tomotoboy" && $3=="Aug") print $0}' tomotoboy pts/16 Aug 7 23:33 (219.221.98.71)
awk内置变量
/home/l/g/tomotoboy >who|awk '{print NF,NR,$0}' 6 1 liuzk423 pts/6 Jul 20 08:27 (219.245.104.240) 6 2 tomotoboy pts/16 Aug 7 23:33 (219.221.98.71) 6 3 liuqingaihn pts/21 Aug 8 00:05 (116.29.229.116) 6 4 liuqingaihn pts/35 Aug 8 00:05 (116.29.229.116) 6 5 uyty pts/38 Aug 7 22:09 (p3213-ipbf803souka.saitama.ocn.ne.jp) 6 6 kenhq pts/40 Aug 7 23:46 (116.77.50.7) 6 7 yagamil pts/46 Aug 7 20:48 (199.40.206.191)
awk内置字符串函数
awk内置字符串函数,awk又很多字符处理函数,这里以length为例
/home/l/g/tomotoboy >who| awk '{print length($1)" "$1}' 8 liuzk423 9 tomotoboy 11 liuqingaihn 11 liuqingaihn 5 kenhq 7 yagamil
如果第一域的长度大于7就输出
/home/l/g/tomotoboy >who| awk '{if(length($1)>7) print length($1)" "$1}' 8 liuzk423 9 tomotoboy 11 liuqingaihn 11 liuqingaihn
字符串屏蔽序列
使用字符串或正则表达式时,有时需要在输出中加入一新行或查询一元字符。打印一新行时,(新行为字符\n) ,给出其屏蔽序列,以不失其特殊含义,用法为在字符串前加入反斜线。例如使用\n强迫打印一新行。如果使用正则表达式,查询花括号({ }) ,在字符前加反斜线,如/ \ { /,将在awk中失掉其特殊含义。
\b 退格键 \t tab键 \f 走纸换页 \ddd 八进制值 \n 新行 \c 任意其他特殊字符,例如\\为反斜线符号 \r 回车键 /home/l/g/tomotoboy >who |awk '{print $1"\t""\t"$2"\n"}' liuzk423 pts/6 tomotoboy pts/16 liuqingaihn pts/21 liuqingaihn pts/35 kenhq pts/40 yagamil pts/46
printf
printf修饰符,prinf基本域C语言的printf相同下面开始举例
/home/l/g/tomotoboy >echo "65" |awk '{printf "%c\n",$0}' A /home/l/g/tomotoboy >echo "65" |awk '{printf "%d\n",$0}' 65 /home/l/g/tomotoboy >echo "65" |awk '{printf "%c\t\t%d\n",$0,$0}' A 65
awk数组
/home/l/g/tomotoboy >awk 'BEGIN {print split("123#456#789",myarray,"#")}' 3
在上面的例子中,split返回数组myarray下标数。实际上myarray数组为:
myarray[1]=123
myarray[2]=456
myarray[3]=789
数组使用前,不必定义,也不必指定数组元素个数。经常使用循环来访问数组。下面是一种循环类型的基本结构:
For (element in array) print array[element]
对于记录“123#456#789” ,先使用split函数划分它,再使用循环打印各数组元素。操作脚本如下:
#!/bin/awk -f #name: arraytest.awk #pprint out am array BEGIN{ record="123#456#789"; split(record,myarray,"#")} END { for (i in myarray) {print myarray[i]}}
要运行脚本,使用/dev/null作为输入文件。
/home/l/g/tomotoboy >arraytest.awk /dev/null 456 789 123
小结
awk语言学起来可能有些复杂,但使用它来编写一行命令或小脚本并不太难。awk是shell编程的一个重要工具。在shell命令或编程中,虽然可以使用awk强大的文本处理能力,但是并不要求你成为这方面的专家
发表评论
-
向脚本传递参数
2009-08-21 16:18 1703shift命令 向脚本传递参数时,有时需要将每一个参数偏移以处 ... -
shell函数
2009-08-10 00:18 2015函数由两部分组成: 函数标题。 函数体。 标题是函数名。函 ... -
后台执行命令——守护进程创建
2009-08-09 19:05 1751当你在终端或控制台工作时,可能不希望由于运行一个作业而占住了屏 ... -
控制流结构——until、while、break、continue
2009-08-08 18:56 2851until循环 条件中1为真, ... -
控制流结构——for
2009-08-08 14:12 1029for循环 for 变量名 in 列表 do 命 ... -
控制流结构——case
2009-08-06 12:53 1017case语句 case语句为多选择语句。可以用case语句匹配 ... -
控制流结构——if then else
2009-08-05 18:49 2630if then else语句 If 条件1 //如果条 ... -
条件控制(test,expr……)
2009-08-04 18:23 1321测试文件状态 test test一般有两种格式,即: test ... -
再谈引号……
2009-08-04 15:37 1002引号 /home/l/g/tomotoboy > ech ... -
shell变量及环境变量
2009-08-03 17:54 1555本地变量 显示变量 $GREAT_PICTURE =" ... -
登陆环境
2009-08-03 10:45 901首先看看/etc/passwd 它保存着用户名、加密后的密码等 ... -
Trap命令详解
2009-08-02 17:40 6498原文地址:http://koudai.36 ... -
ulimit命令详解
2009-08-02 17:30 2281原文地址:http://www.diybl.com/cours ... -
tr用法
2009-08-01 15:35 1855tr用来从标准输入中通 ... -
shell合并和分割
2009-07-31 12:43 2826• 实用的分类(sort)操作。 sort命令的一般格式为: ... -
shell输入输出
2009-07-31 12:38 807echo cat read 管道 '|' tee ... -
sed用法介绍
2009-07-30 15:21 2710输出第1行到第3行 -bash-3.00$ sed -n '1 ... -
shell中单引号和双引号的区别
2009-07-29 15:11 1115shell中单引号和双引号的区别 ''可以讲可执行命令文本化 ... -
grep用法详解
2009-07-29 13:45 2560grep grep一般格式为: grep [选项]基本正则表达 ... -
文本过滤
2009-07-28 00:02 7501.使用句点匹配单字符 句点“.”可以匹配任意单字符。例如,如 ...
相关推荐
### Awk 使用手册详解 #### 一、Awk 简介 Awk 是一种功能强大的文本处理工具,广泛应用于 Unix 和类 Unix 系统中。它的名字来源于三位设计者的名字首字母:Aho (Peter)、Weinberger (Brian) 和 Kernighan (Doug)。...
### awk 使用手册详解 #### 一、awk简介与基本概念 awk 是一款强大的文本处理工具,在 Unix 和类 Unix 操作系统中广泛使用。它最初由 Alfred Aho、Peter Weinberger 和 Brian Kernighan 开发,因此得名 awk(取自...
《Shell AWK使用手册》是为用户提供的一份详细的学习资源,涵盖了AWK在Unix环境中的应用和使用方法。AWK是一种强大的文本分析工具,它的名字来源于三位创始人: Alfred V. Aho, Peter J. Weinberger, 和 Brian W. ...
《AWK使用手册》是专为帮助读者快速掌握AWK编程语言而编写的,通过一系列具有代表性的实例和解析,让读者逐步理解并熟练运用AWK处理数据和生成报表。AWK是一种强大的文本分析工具,它能对输入数据(如文件、标准输入...
此外,由于`awk`通常作为Unix/Linux系统的一部分预装,用户无需额外安装即可直接使用,这使得它成为一个易于获取和使用的工具。 在处理文本数据时,`awk`的优势在于它可以方便地处理分隔符,如空格或制表符,使得...
《awk使用手册-学习AWK首选》是一本详细介绍Unix awk工具的指南,旨在帮助读者从基础到深入地掌握awk的使用。作者池中龙通过详实的解释和丰富的实例,为不同水平的用户提供全面的学习资源。 awk是Unix/Linux环境中...
sed 和 awk 使用实例 Sed 和 Awk 是两种强大的命令行工具,在 Unix 和 Linux 系统中广泛应用于文本处理和数据处理。本文将通过一些实例来展示 Sed 和 Awk 的使用场景和方法。 一、sed 使用实例 1. 删除 login....
### Unix awk 使用手册详解 #### 什么是awk? `awk`,这个名字源于其创造者Aho、Weinberg和Kernighan的首字母缩写,是一个功能强大的文本处理工具,尤其在Unix环境中广受欢迎。与常见的`grep`和`sed`工具相比,`...
### AWK使用手册知识点 #### 一、AWK简介与适用场景 - **AWK**是一种专门用于文本处理和报告生成的脚本语言,在Linux环境下非常流行。 - **适用问题**:AWK适用于处理结构化的文本文件,尤其擅长处理那些包含特定...
### awk使用基本理论 #### 一、awk简介与版本 - **awk** 是 Linux Shell 三剑客之一,主要用于文本处理。它是一种强大的文本分析工具,可以在数据流中搜索匹配的模式并执行相应的操作。 - **awk** 有三个主要版本...
### Unix Awk 使用手册知识点详解 #### 一、Awk 的起源与发展 - **起源**:Awk 语言由 Alfred Aho、Peter Weinberger 和 Brian Kernighan 在 20 世纪 70 年代末期共同创造,其名称正是来源于这三位发明者的姓氏首...
### awk使用手册详解知识点 #### 一、awk简介与适用场景 - **awk**是一种用于文本处理的强大脚本语言,特别适用于处理具有行(Record)和字段(Field)形式的数据。 - **适用问题**:awk适合处理那些需要从文本文件...
### AWK 使用详解知识点 #### 一、AWK 概述与适用场景 - **AWK 的定位**:AWK 是一种专为文本处理设计的脚本语言,它结合了强大的文本处理能力和易于上手的特点,非常适合用于数据分析、报告生成等应用场景。 - **...
### AWK使用简介 #### 一、AWK概述 AWK是一种专为文本处理而设计的编程语言,广泛应用于Linux/Unix环境中。它能够高效地处理来自标准输入、单个或多个文件,甚至其他命令输出的数据。作为一种强大的编程工具,AWK...
### Unix之AWK使用详解 #### 一、AWK简介 AWK是一种强大的文本处理工具,在Unix和类Unix操作系统中广泛使用。它不仅能够高效地处理数据,还具备一定的编程能力,可以用来编写复杂的脚本。 #### 二、基本语法与...
Linux 主要shell命令、sed、awk使用详解 Linux 主要shell命令详解 shell 是用户和 Linux 操作系统之间的接口。Linux 中有多种 shell,其中缺省使用的是 Bash。本章讲述了 shell 的工作原理,shell 的种类,shell ...
### Shell编程中的AWK使用详解 #### 一、AWK简介 AWK 是一种功能强大的文本处理工具,其名称来源于三位创始人 Alfred Aho、Peter Weinberger 和 Brian Kernighan 的首字母。它不仅广泛应用于 Linux 环境,也是任何...