当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 4 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : AWK 的 ARGV和ARGC怎么用?
帖子发表于 : 2008-07-24 14:36 

注册: 2008-05-25 20:35
帖子: 241
送出感谢: 0 次
接收感谢: 0 次
awk -f awkfile filename

这样调用awk的话,怎么传递命令行参数?在awkfile里又怎么取得命令行参数?


页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2008-07-24 14:56 
头像

注册: 2006-04-12 20:05
帖子: 8495
地址: 杭州
送出感谢: 0 次
接收感谢: 8
9. 如何读取命令行上的参数

大部分的应用程序都允许使用者在命令之后增加一些选择性的参数.执行awk时这些参数大部分用于指定数据文件文件名, 有时希望在程序中能从命令行上得到一些其它用途的数据. 本小节中将叙述如何在awk程序中取用这些参数.

建立文件如下, 命名为 see_arg :

#!/bin/sh



awk '

BEGIN {

for( i=0; i<ARGC ; i++)

print ARGV[i] # 依次印出awk所记录的参数

}

' $*

执行如下命令 :

$ ./see_arg first-arg second-arg

结果屏幕出现 :

awk

first-arg

second-arg

[ 说明 : ]

ARGC, ARGV[ ] 为awk所提供的内建变量.



ARGC : 为一整数. 代表命令行上, 除了选项-v, -f 及其对应的参数之外所有参数的数目.

ARGV[ ] : 为一字符串数组. ARGV[0],ARGV[1],...ARGV[ARGC-1].

分别代表命令行上相对应的参数.



例如, 当命令行为 :

$ awk -vx=36 -f program1 data1 data2



$ awk '{ print $1 ,$2 }' data1 data2

其 ARGC 之值为 3

ARGV[0] 之值为 "awk"

ARGV[1] 之值为 "data1"

ARGV[2] 之值为 "data2"

命令行上的 "-f program1", " -vx=36", 或程序部分 '{ print $1, $2}' 都不会列入 ARGC 及 ARGV[ ] 中.

awk 利用 ARGC 来判断应开启的数据文件个数.

但使用者可强行改变 ARGC; 当 ARGC 之值被使用者设为 1 时;

awk将被蒙骗,误以为命令行上并无数据文件文件名, 故不会以 ARGV[1], ARGV[2],..为文件名来打开文件读取数据; 但在程序中仍可通过 ARGV[1], ARGV[2],..来取得命令行上的数据.





某一程序 test1.awk 如下 :

BEGIN{

number = ARGC #先用number 记住实际的参数个数.

ARGC = 2 # 自行更改 ARGC=2, awk将以为只有一个资料文件

# 仍可藉由ARGV[ ]取得命令行上的资料.

for( i=2; i<number; i++) data[i] = ARGV[i]

}

........

于命令行上键入

$ awk -f test1.awk data_file apple orange

执行时 awk 会打开数据文件 data_file 以进行处理. 但不会打开以apple,orange 为档名的文件(因为 ARGC 被改成2). 但仍可通过ARGV[2], ARGV[3]取得命令行上的参数 apple, orange



也可以用下列命令来达成上例的效果.

$awk -f test2.awk -v data[2]="apple" -v data[3]="orange" data_file


详见: http://linuxfire.com.cn/~lily/awk.html :lol:


_________________
关注我的blog: ε==3


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2008-07-24 14:59 

注册: 2008-07-22 9:56
帖子: 14
送出感谢: 0 次
接收感谢: 0 次
An example:

代码:
#!/usr/bin/awk -f

BEGIN {
   print "You may access ARGV here"
   if (ARGC > 1) {
      print "you have specified " ARGC - 1 " argument(s)."
      for (i = 1; i < ARGC; i++) {
         print "ARGV[" i "]=" ARGV[i]
      }
   }
   if (prefix == "") {
      prefix = "> "
   }
}

ARGIND < 3 {
   print prefix $0
}

END {
   print "The End"
}


You can also assign variables like this:
代码:
$ awk -f foo.awk prefix="<>" arg1 arg2 arg3 ...


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2008-07-24 15:59 

注册: 2008-05-25 20:35
帖子: 241
送出感谢: 0 次
接收感谢: 0 次
bones7456 写道:
9. 如何读取命令行上的参数

大部分的应用程序都允许使用者在命令之后增加一些选择性的参数.执行awk时这些参数大部分用于指定数据文件文件名, 有时希望在程序中能从命令行上得到一些其它用途的数据. 本小节中将叙述如何在awk程序中取用这些参数.

建立文件如下, 命名为 see_arg :

#!/bin/sh



awk '

BEGIN {

for( i=0; i<ARGC ; i++)

print ARGV[i] # 依次印出awk所记录的参数

}

' $*

执行如下命令 :

$ ./see_arg first-arg second-arg

结果屏幕出现 :

awk

first-arg

second-arg

[ 说明 : ]

ARGC, ARGV[ ] 为awk所提供的内建变量.



ARGC : 为一整数. 代表命令行上, 除了选项-v, -f 及其对应的参数之外所有参数的数目.

ARGV[ ] : 为一字符串数组. ARGV[0],ARGV[1],...ARGV[ARGC-1].

分别代表命令行上相对应的参数.



例如, 当命令行为 :

$ awk -vx=36 -f program1 data1 data2



$ awk '{ print $1 ,$2 }' data1 data2

其 ARGC 之值为 3

ARGV[0] 之值为 "awk"

ARGV[1] 之值为 "data1"

ARGV[2] 之值为 "data2"

命令行上的 "-f program1", " -vx=36", 或程序部分 '{ print $1, $2}' 都不会列入 ARGC 及 ARGV[ ] 中.

awk 利用 ARGC 来判断应开启的数据文件个数.

但使用者可强行改变 ARGC; 当 ARGC 之值被使用者设为 1 时;

awk将被蒙骗,误以为命令行上并无数据文件文件名, 故不会以 ARGV[1], ARGV[2],..为文件名来打开文件读取数据; 但在程序中仍可通过 ARGV[1], ARGV[2],..来取得命令行上的数据.





某一程序 test1.awk 如下 :

BEGIN{

number = ARGC #先用number 记住实际的参数个数.

ARGC = 2 # 自行更改 ARGC=2, awk将以为只有一个资料文件

# 仍可藉由ARGV[ ]取得命令行上的资料.

for( i=2; i<number; i++) data[i] = ARGV[i]

}

........

于命令行上键入

$ awk -f test1.awk data_file apple orange

执行时 awk 会打开数据文件 data_file 以进行处理. 但不会打开以apple,orange 为档名的文件(因为 ARGC 被改成2). 但仍可通过ARGV[2], ARGV[3]取得命令行上的参数 apple, orange



也可以用下列命令来达成上例的效果.

$awk -f test2.awk -v data[2]="apple" -v data[3]="orange" data_file


详见: http://linuxfire.com.cn/~lily/awk.html :lol:


thanks


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 4 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译