⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 awk最新教程.txt

📁 linux下的命令
💻 TXT
📖 第 1 页 / 共 4 页
字号:
第一章 简介 

awk是Unix操作系统提供的一个程序化语句,是为了使信息和文本的处理更易于表达和完成而设计的。它对于资料的处理具有很强的功能:对于文本文件里的内容做修改、对比、抽取等的处理,可以以很短的语句轻易完成。而象C或Pascal等高级语言要完成上述的动作,相对要麻烦得多。 

awk 是在一组输入信息或文件上运行的,它浏览输入行,按照行次顺序,一次一行地进行处理。在一行中寻找程序中描述的模式,发现该模式,则进行相应的操作,处理完一行后,再进行下一行的处理,直到文件结束。从awk在操作系统中所处的位置(/usr/bin/awk)来看,awk是Unix的一个命令;从它提供的内部语句来看,awk又象是一个程序语言。在以后的讨论中称它为语句或程序,但这都没什么区别。

awk 这个名字是由它的几个设计者姓氏的第一个字母而命名:Alfred V. Aho, Peter J. Weinberger, Brian W. Kernighan。awk最初在1977年完成,后来又经过多次修改,这里讨论的awk实例都是在SCO UNIX 3.0 上通过的。



第二章 基础知识

2.1.基本程序结构

awk 程序是由若干个“模式”与“动作”所组成的,其执行方式是针对文件中的每一行(line)搜索指定的模式(patterns),当一行中有符合指定的模式,awk就会在此一行执行被指定的动作(actions)。awk 依次方式处理输入文件的每一行直到输入文件结束。“动作”一般写在花括号{ } 里面,一个模式后面就跟着一个动作,一个动作可以是一条或多条语句。

整个awk程式就象下面的形式:

awk ‘模式 {动作} ................. 模式 { 动作 }’ filename
这种形式是从filename文件中读入数据

command | awk ‘模式 { 动作 } .............. 模式 { 动作 }’ 
这种形式通过管道将命令的输出传递给awk语句。

例:
awk ‘$1 == ”127.0.0.1” { print $2 }’ /etc/hosts		#从/etc/hosts中读入数据

cat /etc/hosts | awk ‘$1 == “127.0.0.1” { print $2 }’	#则是接收cat /etc/hosts的结果

以上两个例子都是将/etc/hosts文件中所有第一个字段为127.0.0.1的行的第二个字段打印出来。
其运行结果为:
localhost 

在awk中,“模式”或“动作”能够被省略,但通常是省略模式。模式被省略后,对于输入文件里面的每一行,动作都会被执行。而如果“动作”被省略,awk语句只会去寻找你所指定的模式,但即使找到了也不执行其它任何操作(因为没有指定动作),就象在Unix系统中你用find命令去寻找一个文件,但是没有用 –print 参数来说明要显示一样,find只是找到了这个文件,但并不显示出来。

如:awk ‘{ print $2 }’ /etc/hosts			#从/etc/hosts文件中读入数据,将每个记录(行)的第二个字段打印出来。
运行结果为:localhost peixun1 

而:awk ‘$1=“127.0.0.1”’ /etc/hosts 只是在/etc/hosts文件中寻找,看看哪一行的第一个字段为127.0.0.1,不管找到与否,一概不显示。 所以结果是:什么都没有

2.2.如何执行awk语句

基本上,有三种方法可以执行awk语句。
a. 如果awk程序很短,则awk可以直接写在命令行上:
awk 'program' input-file1 input-file2 ... 
其中program包括一些模式和动作,就象前面的例子一样。input-file1 input-file2 ...为数据文件名,程序将从中读取数据。文件名可以多于一个,当同时存在多个文件名时,程序将顺序处理这些文件。
b. 如果awk语句较长,较为方便也是通常的做法是将整个awk语句存放在一个文本文件中,通过文件名来执行这段程序。如一个awk命令的所有语句都放在了一个叫mypro的文件中,那么可以通过下面的方式来执行:
mypro
c. 也可以只将'program'部分即“模式与动作”部分写在文件中,通过以下的方式执行:
awk -f program-file1 -f program-file2 ...input-file1 input-file2 ...
其中,program-file1,program-file2是存放“模式与动作”的文件名称,他通过-f参数被调用,命令文件的个数也可以有多个,在使用时,每个文件名前面都必须要有-f参数。
如:
file1为:‘{ print $1,$2,$3 }’
file2为:‘{ print $2,$3,$4 }’
file3为: I am a student
file4为: You are a teacher
则:执行 awk -f ./file1 -f ./file2 ./file3 ./file4 的结果为:
I am a am a student You are a are a student

我们建议使用第二种方法,简单而又方便。

2.3 变量

awk中的变量和Shell中的变量相似,都不用事先定义,也没有类型的区别(都是字符串型),在使用时可随时进行定义。
awk中的变量分以下几种:
1)字段变量 awk处理数据时是逐行进行处理的,字段变量就是在处理过程中表示当前记录各字段的变量,其形式和含义如下:$0	所处理的当前行(字符串);
$1	当前行(记录)的第一个字段
$2	当前行(记录)的第二个字段
$3	当前行(记录)的第三个字段
………
如: awk ‘{ print $1,“|”,$2 }’ /tmp/test
该语句将/tmp目录下的test文件的第一和第二个字段打印出来,字段间的分隔符为“|”.
2) 内部变量 awk的每次执行,都建立了一些缺省的变量,也叫做内部变量,这些变量有固定的名字和固定的含义,它们在程序运行期间可以随时被引用。
具体定义如下:
FS	输入记录字段间的分隔符
RS	输入记录的分隔符
OFS	输出记录字段间的分隔符
ORS	输出记录的分隔符
NR	当前行数
NF	当前记录字段数
ARGC	命令行参数个数

前四个内部变量在使用时一般用于设定你所需要的分隔副符,具体的使用方法如下例所示:
awk ‘BEGIN { FS=“|” ;OFS=”|” } { print $1,$2,…… }’ 文件名	#指明输入输出时都以“|”为字段间的分隔符
后面三个内部变量用于模式部分较多,在动作部分也有使用。
awk ‘ NR==10 { print $1,$2,…… }’ 文件名 				#用于限定只对第十行进行处理。
awk ‘ BEGIN { SUM=0 } { SUM=SUM+NF } END { print “本文总共” SUM “个字段” }’ 文件名 
#对SUM变量赋初值,同时利用NF变量获得每行字段数的总和;

3) 自定义变量在awk语言的任意动作区间,即在{}之内,均可随时定义变量,无须事先说明。但一般情况下是在BEGIN中定义变量并赋以初值,在动作区域内使用。

如:awk ‘BEGIN { sum=“0” } { sum=sum+1 } END { print sum }’file
上面命令定义变量sum,其初值为0,对于每一条记录变量sum加1,整条语句将计算出文件总的字段数。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -