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

📄 awk手册.txt

📁 关于ns使用技巧的大集
💻 TXT
📖 第 1 页 / 共 2 页
字号:

例:示例getline的使用 

{while(getline==1) 
{ 
#process the inputted fields 
} 
} 

也可以使getline保存输入数据在一个字段中,而不是通过使用getline variable的形式处理一般字段。当使用这种方式时,NF被置成0,FNR和NR被增值。 

用户也可以使用getline<"filename"方式从一个给定的文件中输入数据,而不是从命令行所列内容输入数据。此时,getline将完成一般字段分离(设置字段变量$0和NF)。如果文件不存在,返回-1,成功,返回1,返回0表示失败。用户可以从给定文件中读取数据到一个变量中,也可以用stdin(标准输入设备)或一个包含这个文件名的变量代替filename。值得注意的是当使用这种方式时不修改FNR和NR。 

另一种使用getline语句的方法是从UNIX命令接受输入,例如下面的例子: 

例:示例从UNIX命令接受输入 

{while("who -u"|getline) 
{ 
#process each line from the who command 
} 
} 

当然,也可以使用如下形式: 

"command" | getline variable 

3.关闭文件: 

awk中允许在程序中关闭一个输入或输出文件,方法是使用awk的close语句。 

close("filename") 

filename可以是getline打开的文件(也可以是stdin,包含文件名的变量或者getline使用的确切命令)。或一个输出文件(可以是stdout,包含文件名的变量或使用管道的确切命令)。 

4.输出到一个文件: 

awk中允许用如下方式将结果输出到一个文件: 

printf("hello word!\n")>"datafile" 
printf("hello word!\n")>>"datafile" 

5.输出到一个命令 

awk中允许用如下方式将结果输出到一个命令: 

printf("hello word!\n")|"sort-t','" 

awk与shell script混合编程 

因为awk可以作为一个shell命令使用,因此awk能与shell批处理程序很好的融合在一起,这给实现awk与shell程序的混合编程提供了可能。实现混合编程的关键是awk与shell script之间的对话,换言之,就是awk与shell script之间的信息交流:awk从shell script中获取所需的信息(通常是变量的值)、在awk中执行shell命令行、shell script将命令执行的结果送给awk处理以及shell script读取awk的执行结果等等。 

1.awk读取Shell script程序变量 

在awk中我们可以通过“'$变量名'”的方式读取sell scrpit程序中的变量。 

例:在下面的示例中,我们将读取sell scrpit程序中的变量Name,该变量存放的是文本myfile的撰写者,awk将打印出这个人名。 

$cat writename 
: 
# @(#) 
# 
. 
. 
. 
Name="张三" nawk 'BEGIN {name="'Name'";\ printf("\t%s\t撰写者%s\n",FILENAME,name");}\ 
{...}END{...}' myfile 
. 
. 
. 

2.将shell命令的执行结果送给awk处理 

作为信息传送的一种方法,我们可以将一条shell命令的结果通过管道线(|)传递给awk处理: 

例:示例awk处理shell命令的执行结果 

$who -u | awk '{printf("%s正在执行%s\n",$2,$1)}' 

该命令将打印出注册终端正在执行的程序名。 

3.shell script程序读awk的执行结果 

为了实现shell script程序读取awk执行的结果,我们可以采取一些特殊的方法,例如我们可以用变量名=`awk语句`的形式将awk执行的结果存放入一个shell script变量。当然也可以用管道线的方法将awk执行结果传递给shell script程序处理。 

例:作为传送消息的机制之一,UNIX提供了一个向其所有用户传送消息的命令wall(意思是write to all写给所有用户),该命令允许向所有工作中的用户(终端)发送消息。为此,我们可以通过一段shell批处理程序wall.shell来模拟这一程序(事实上比较老的版本中wall就是一段shell批处理程序: 

$cat wall.shell 
: 
# @(#) wall.shell:发送消息给每个已注册终端 
# 
cat >/tmp/$$ 
#用户录入消息文本 who -u | awk '{print $2}' | while read tty 
do 
cat /tmp/$$>$tty 
done 

在这个程序里,awk接受who -u命令的执行结果,该命令打印出所有已注册终端的信息,其中第二个字段是已注册终端的设备名,因此用awk命令析出该设备名,然后用while read tty语句循环读出这些文件名到变量(shell script变量)tty中,作为信息传送的终结地址。 

4.在awk中执行shell命令行----嵌入函数system() 

system()是一个不适合字符或数字类型的嵌入函数,该函数的功能是处理作为参数传递给它的字符串。system对这个参数的处理就是将其作为命令处理,也就是说将其当作命令行一样加以执行。这使得用户在自己的awk程序需要时可以灵活地执行命令或脚本。 

例:下面的程序将使用system嵌入函数打印用户编制好的报表文件,这个文件存放在名为myreport.txt的文件中。为简约起见,我们只列出了其END部分: 

. 
. 
. 
END {close("myreport.txt");system("lp myreport.txt");} 

在这个示例中,我们首先使用close语句关闭了文件myreport.txt文件,然后使用system嵌入函数将myreport.txt送入打印机打印。 

写到这里,我不得不跟朋友们说再见了,实在地说,这些内容仍然是awk的初步知识,电脑永远是前进的科学,awk也不例外,本篇所能做的只是在你前行的漫漫长途中铺平一段小小开端,剩下的路还得靠你自己去走。老实说,如果本文真能给你前行的路上带来些许的方便,那本人就知足了! 

如对本篇有任何疑问,请E-mail To:Chizlong@yeah.net或到主页http://chizling.yeah.net中留言。
附录: 

1.awk的常规表达式元字符 

\ 换码序列 
^ 在字符串的开头开始匹配 
$ 在字符串的结尾开始匹配 
. 与任何单个字符串匹配 
[ABC] 与[]内的任一字符匹配 
[A-Ca-c] 与A-C及a-c范围内的字符匹配(按字母表顺序) 
[^ABC] 与除[]内的所有字符以外的任一字符匹配 
Desk|Chair 与Desk和Chair中的任一个匹配 
[ABC][DEF] 关联。与A、B、C中的任一字符匹配,且其后要跟D、E、F中的任一个字符。 
* 与A、B或C中任一个出现0次或多次的字符相匹配 
+ 与A、B或C中任何一个出现1次或多次的字符相匹配 
? 与一个空串或A、B或C在任何一个字符相匹配 
(Blue|Black)berry 合并常规表达式,与Blueberry或Blackberry相匹配 

2.awk算术运算符 

运算符 用途 
------------------ 
x^y x的y次幂 
x**y 同上 
x%y 计算x/y的余数(求模) 
x+y x加y 
x-y x减y 
x*y x乘y 
x/y x除y 
-y 负y(y的开关符号);也称一目减 
++y y加1后使用y(前置加) 
y++ 使用y值后加1(后缀加) 
--y y减1后使用y(前置减) 
y-- 使用后y减1(后缀减) 
x=y 将y的值赋给x 
x+=y 将x+y的值赋给x 
x-=y 将x-y的值赋给x 
x*=y 将x*y的值赋给x 
x/=y 将x/y的值赋给x x%=y 将x%y的值赋给x 
x^=y 将x^y的值赋给x 
x**=y 将x**y的值赋给x 

3.awk允许的测试: 

操作符 含义 

x==y x等于y 
x!=y x不等于y 
x>y x大于y 
x>=y x大于或等于y 
xx<=y x小于或等于y? 
x~re x匹配正则表达式re? 
x!~re x不匹配正则表达式re? 

4.awk的操作符(按优先级升序排列) 

= 、+=、 -=、 *= 、/= 、 %= 
|| 
&& 
> >= < <= == != ~ !~ 
xy (字符串连结,'x''y'变成"xy") 
+ - 
* / % 
++ -- 

5.awk内置变量(预定义变量) 

说明:表中v项表示第一个支持变量的工具(下同):A=awk,N=nawk,P=POSIX awk,G=gawk 

V 变量 含义 缺省值 
-------------------------------------------------------- 
N ARGC 命令行参数个数 
G ARGIND 当前被处理文件的ARGV标志符 
N ARGV 命令行参数数组 
G CONVFMT 数字转换格式 %.6g 
P ENVIRON UNIX环境变量 
N ERRNO UNIX系统错误消息 
G FIELDWIDTHS 输入字段宽度的空白分隔字符串 
A FILENAME 当前输入文件的名字 
P FNR 当前记录数 
A FS 输入字段分隔符 空格 
G IGNORECASE 控制大小写敏感0(大小写敏感) 
A NF 当前记录中的字段个数 
A NR 已经读出的记录数 
A OFMT 数字的输出格式 %.6g 
A OFS 输出字段分隔符 空格 
A ORS 输出的记录分隔符 新行 
A RS 输入的记录他隔符 新行 
N RSTART 被匹配函数匹配的字符串首 
N RLENGTH 被匹配函数匹配的字符串长度 
N SUBSEP 下标分隔符 "\034" 

6.awk的内置函数 

V 函数 用途或返回值 
------------------------------------------------ 
N gsub(reg,string,target) 每次常规表达式reg匹配时替换target中的string 
N index(search,string) 返回string中search串的位置 
A length(string) 求串string中的字符个数 
N match(string,reg) 返回常规表达式reg匹配的string中的位置 
N printf(format,variable) 格式化输出,按format提供的格式输出变量variable。 
N split(string,store,delim) 根据分界符delim,分解string为store的数组元素 
N sprintf(format,variable) 返回一个包含基于format的格式化数据,variables是要放到串中的数据 
G strftime(format,timestamp) 返回一个基于format的日期或者时间串,timestmp是systime()函数返回的时间 
N sub(reg,string,target) 第一次当常规表达式reg匹配,替换target串中的字符串 
A substr(string,position,len) 返回一个以position开始len个字符的子串 
P totower(string) 返回string中对应的小写字符 
P toupper(string) 返回string中对应的大写字符 
A atan(x,y) x的余切(弧度) 
N cos(x) x的余弦(弧度) 
A exp(x) e的x幂 
A int(x) x的整数部分 
A log(x) x的自然对数值 
N rand() 0-1之间的随机数 
N sin(x) x的正弦(弧度) 
A sqrt(x) x的平方根 
A srand(x) 初始化随机数发生器。如果忽略x,则使用system() 
G system() 返回自1970年1月1日以来经过的时间(按秒计算)

⌨️ 快捷键说明

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