gawk安装与配置全解析
1. 配置过程
如果你对使用C语言和类Unix操作系统有所了解,那么这部分内容会很有用。gawk的源代码通常会尽可能遵循正式标准,这意味着gawk使用的是ISO C标准和POSIX操作系统接口标准指定的库例程,其源代码需要使用ISO C编译器(1990标准)。
许多Unix系统并不完全支持ISO或POSIX标准,gawk发行版中的
missing_d
子目录包含了那些最可能缺失的函数的替代版本。
configure
创建的
config.h
文件包含了描述你尝试编译gawk的特定操作系统特性的定义,具体描述了以下三方面内容:
- 可用的头文件,以便正确包含它们。
- 你的C库中实际可用的(所谓)标准函数。
- 关于你的操作系统的各种杂项信息。
例如,如果
stat
结构中没有
st_blksize
元素,那么
‘HAVE_STRUCT_STAT_ST_BLKSIZE’
将未定义。
你的C编译器可能会向
configure
提供错误信息,它可能在库函数不可用时不报错退出。为了解决这个问题,可以编辑
custom.h
文件。使用适合你系统的
#ifdef
,并定义
configure
应该定义但未定义的常量,或者取消定义
configure
定义了但不应该定义的常量。
custom.h
文件会被
config.h
文件自动包含。
此外,Autoconf生成的
configure
程序可能在你的系统上无法正常工作。如果遇到问题,
configure.ac
文件是Autoconf的输入,你可以修改这个文件并生成一个能在你系统上工作的新
configure
版本。
graph TD
A[开始配置] --> B[检查ISO和POSIX标准支持]
B --> C{支持全部标准?}
C -- 是 --> D[使用标准库例程]
C -- 否 --> E[使用missing_d子目录中的替代函数]
D --> F[运行configure生成config.h]
E --> F
F --> G{编译器是否报错?}
G -- 是 --> H[处理错误]
G -- 否 --> I[检查custom.h文件]
H --> I
I --> J{是否需要修改configure.ac}
J -- 是 --> K[修改configure.ac并重新生成configure]
J -- 否 --> L[完成配置]
K --> L
2. 在PC操作系统上的安装
这部分涵盖了在运行MS-DOS和任何版本MS-Windows的英特尔架构机器上安装和使用gawk的内容。“Windows32”指的是Microsoft Windows 95/98/ME/NT/2000/XP/Vista/7/8。
由于MS-DOS(以及其他操作系统下的MS-DOS shell)的限制,各种“DOS扩展程序”经常与gawk等程序一起使用。Microsoft Windows 3.1和Windows32的不同功能也可能会增加复杂性。
2.1 为PC操作系统编译gawk
可以使用DJ Delorie的GNU开发工具(DJGPP:仅适用于MS-DOS)或MinGW(适用于Windows32)为MS-DOS和Windows32编译gawk。gawk发行版中的
README_d/README.pc
文件包含额外说明,
pc/Makefile
包含重要的编译选项信息。
编译步骤如下:
1. 将
pc
目录中的文件(除了
ChangeLog
)复制到包含gawk其他源代码的目录。
2. 使用适当的目标名称作为参数调用
make
来构建gawk。从
pc
目录复制的
Makefile
包含一个带有注释的配置部分,可能需要进行编辑以适应你的
make
工具。
Makefile
支持多个目标来构建各种MS-DOS和Windows32版本。如果
make
命令不指定目标,会打印出目标列表。例如,要使用DJGPP工具构建gawk,输入
make djgpp
(构建所需的DJGPP工具可在
ftp://ftp.delorie.com/pub/djgpp/current/v2gnu/
找到);要使用MinGW工具构建原生MS-Windows二进制的gawk,输入
make mingw32
。
2.2 测试gawk
使用
make
运行标准测试并安装gawk需要额外的类Unix工具,包括
sh
、
sed
和
cp
。为了运行测试,
test/*.ok
文件可能需要转换为具有通常的MS-DOS风格的行尾标记。或者,运行
make check CMP="diff -a"
以使用GNU
diff
的文本模式而不是
cmp
来比较结果文件。
2.3 使用gawk
在MS-DOS和MS-Windows下,Cygwin和MinGW环境支持
|&
运算符和TCP/IP网络。
gawk的MS-DOS和MS-Windows版本按照“AWKPATH环境变量”的描述搜索程序文件,但
AWKPATH
变量中的元素用分号而不是冒号分隔。如果
AWKPATH
未设置或为空,默认搜索路径是
.;c:/lib/awk;c:/gnu/lib/awk
。
一个类似
sh
的shell(与MS-DOS下的
command.com
或MS-Windows下的
cmd.exe
不同)对于awk编程可能很有用,DJGPP工具集包含了Bash的MS-DOS端口。
在MS-Windows和MS-DOS下,gawk(以及许多其他文本程序)会在输入时将行尾的
\r\n
静默转换为
\n
,在输出时将
\n
转换为
\r\n
。特殊的
BINMODE
变量允许控制这些转换,其解释如下:
| BINMODE值 | 含义 |
| ---- | ---- |
| “r” 或 1 | 读取时设置为二进制模式(即读取时不进行转换) |
| “w” 或 2 | 写入时设置为二进制模式(即写入时不进行转换) |
| “rw” 或 “wr” 或 3 | 读写都设置为二进制模式 |
| 非空字符串 | 等同于
BINMODE=3
(即读写都不进行转换),但如果字符串不是”rw”或”wr”,gawk会发出警告信息 |
标准输入和标准输出的模式仅设置一次(在读取命令行之后,但在处理任何awk程序之前)。通过在命令行上使用适当的
-v BINMODE=N
选项可以设置标准输入或标准输出的
BINMODE
。
BINMODE
在打开文件或管道时设置,中途不能更改。
以下是一些设置二进制模式的示例:
- 设置标准输出和其他文件的写入二进制模式,并将
ORS
设置为通常的MS-DOS风格行尾:
gawk -v BINMODE=2 -v ORS="\r\n" …
或者
gawk -v BINMODE=w -f binmode2.awk …
- 更改记录分隔符为
\r\n
并设置读取二进制模式,但不影响标准输入模式:
gawk -v RS="\r\n" -e "BEGIN { BINMODE = 1 }" …
或者
gawk -f binmode1.awk …
2.4 在Cygwin环境中使用gawk
如果你使用Cygwin环境,在MS-Windows下可以直接构建和使用gawk。该环境使用Bash、GCC、GNU Make和其他GNU程序,很好地模拟了GNU/Linux。Cygwin的编译和安装过程与Unix系统相同:
tar -xvpzf gawk-4.1.2.tar.gz
cd gawk-4.1.2
./configure
make && make check
与同一系统上的GNU/Linux相比,Cygwin上的
configure
步骤需要更长的时间,但最终会完成,之后
make
过程照常进行。
2.5 在MSYS环境中使用gawk
在MS-Windows的MSYS环境中,gawk自动使用二进制模式读写文件,因此不需要使用
BINMODE
变量。但这可能会给其他移植到MS-Windows的类Unix组件带来问题,因为它们期望gawk能自动转换
\r\n
,而实际上gawk不会。
3. 在Vax/VMS和OpenVMS上编译和安装gawk
这部分将详细介绍在VMS系统下编译和安装gawk的方法。这里的“VMS”泛指OpenVMS。
3.1 编译gawk
在VMS下编译gawk,有两种方式可供选择:一是使用DCL命令程序,它会发出所有必要的CC和LINK命令;二是使用适用于MMS和MMK实用程序的Makefile。从源代码目录开始,可以使用以下任意一种方法:
1. 使用DCL命令程序:
$ @[.vms]vmsbuild.com
- 使用MMS:
$ MMS/DESCRIPTION=[.vms]descrip.mms gawk
- 使用MMK:
$ MMK/DESCRIPTION=[.vms]descrip.mms gawk
MMK是MMS的开源免费近似克隆版本,能更好地处理支持大小写文件名的ODS - 5卷。MMK可从
https://github.com/endlesssoftware/mmk
获取。在使用ODS - 5卷并启用扩展解析时,目标参数的大小写可能需要严格匹配。
gawk已在多个VMS版本和架构上进行了测试,如VAX/VMS 7.3、Alpha/VMS 7.3 - 1、Alpha/VMS 7.3、Alpha/VMS 7.3 - 2和IA64/VMS 8.3等。最近的构建在Alpha VMS 8.3上使用HP C V7.3,在Alpha和IA64 VMS 8.4上使用HP C 7.3.1。
graph TD
A[开始编译] --> B{选择编译方式}
B -- DCL命令程序 --> C[@[.vms]vmsbuild.com]
B -- MMS --> D[MMS/DESCRIPTION=[.vms]descrip.mms gawk]
B -- MMK --> E[MMK/DESCRIPTION=[.vms]descrip.mms gawk]
C --> F[完成编译]
D --> F
E --> F
3.2 编译gawk动态扩展
移植到VMS的扩展可以使用以下命令之一进行编译:
$ MMS/DESCRIPTION=[.vms]descrip.mms extensions
或者
$ MMK/DESCRIPTION=[.vms]descrip.mms extensions
gawk使用
AWKLIBPATH
作为环境变量或逻辑名称来查找动态扩展。动态扩展需要使用与编译gawk本身相同的编译器选项进行编译,包括浮点运算、指针大小和符号名称处理。具体要求如下:
| 架构 | 编译器选项 |
| ---- | ---- |
| Alpha和Itanium |
/name=(as_is,short)<br>/float=ieee/ieee_mode=denorm_results
|
| VAX |
/name=(as_is,short)
|
编译时宏需要在包含第一个VMS提供的头文件之前定义,示例代码如下:
#if (__CRTL_VER >= 70200000) && !defined (__VAX)
#define _LARGEFILE 1
#endif
#ifndef __VAX
#ifdef __CRTL_VER
#if __CRTL_VER >= 80200000
#define _USE_STD_STAT 1
#endif
#endif
#endif
如果编写自己的VMS扩展,必须自行提供这些定义。在VMS上构建gawk时创建的
config.h
文件会为你完成这些定义;如果使用该文件或类似文件,必须记得在包含任何VMS提供的头文件之前包含它。
3.3 安装gawk
要使用gawk,只需要一个“外部”命令,即一个值以美元符号开头的DCL符号。例如:
$ GAWK :== $disk1:[gnubin]gawk
将
$disk1:[gnubin]
替换为gawk.exe的实际位置。这个符号应该放在任何想要运行gawk的用户的
login.com
文件中,以便用户每次登录时都能定义该符号。或者,也可以将该符号放在系统范围的
sylogin.com
程序中,这样所有用户都可以运行gawk。
如果gawk是通过PCSI套件安装到
GNV$GNU:
目录树中的,程序名将是
GNV$GNU:[bin]gnv$gawk.exe
,帮助文件将是
GNV$GNU:[vms_help]gawk.hlp
。PCSI套件还会安装一个
GNV$GNU:[vms_bin]gawk_verb.cld
文件,可用于将gawk和awk添加为DCL命令。
对于当前进程,可以使用以下命令:
$ set command gnv$gnu:[vms_bin]gawk_verb.cld
系统管理员可以使用
GNV$GNU:[vms_bin]gawk_verb.cld
将gawk和awk添加到系统范围的
DCLTABLES
中。DCL语法在
gawk.hlp
文件中有文档说明。
可选地,可以将
gawk.hlp
条目加载到VMS帮助库中:
$ LIBRARY/HELP sys$help:helplib [.vms]gawk.hlp
可以用特定于站点的帮助库替换标准的VMS库
HELPLIB
。加载帮助文本后,使用以下命令:
$ HELP GAWK
可以获取关于gawk实现和awk编程语言的信息。逻辑名称
AWK_LIBRARY
可以指定awk程序文件的默认位置。对于
-f
选项,如果指定的文件名中没有设备或目录路径信息,gawk首先会在当前目录中查找,然后在
AWK_LIBRARY
翻译指定的目录中查找。如果在两个目录中都未找到文件,gawk会在文件名后添加
.awk
后缀并重新尝试查找。如果
AWK_LIBRARY
未定义,则默认值为
SYS$LIBRARY:
。
3.4 运行gawk
VMS上的命令行解析和引号约定与其他系统有显著不同,因此本书或其他来源中的示例通常需要进行一些小的更改,但更改幅度较小,所有awk程序都应该能正常运行。以下是两个简单的测试示例:
$ gawk -- "BEGIN {print \"Hello, World!\"}"
$ gawk -"W" version
注意,大写和混合大小写的文本必须加引号。VMS版的gawk除了原始的shell风格接口外,还包括一个DCL风格的接口。双命令行解析的一个副作用是,如果只有一个参数(如带引号的字符串程序),命令会变得模糊不清。为了解决这个问题,通常可选的
--
标志是必需的,以强制使用Unix风格的解析而不是DCL解析。如果存在其他破折号类型的选项(或多个要处理的参数,如数据文件),则不存在歧义,可以省略
--
。
程序退出时,退出值是Unix风格的值,并会编码为VMS退出状态值。VMS严重性位将根据退出值设置。失败用1表示,VMS会设置
ERROR
状态;致命错误用2表示,VMS会设置
FATAL
状态;其他所有值都表示
SUCCESS
状态。退出值会进行编码以符合VMS编码标准,其
C_FACILITY_NO
为
0x350000
,并在将数字左移3位后加上常量
0xA000
以留出严重程度代码的空间。要从VMS状态中提取实际的gawk退出代码,可以使用以下公式:
unix_status = (vms_status .and. &x7f8) / 8
使用
exec()
调用gawk的C程序将获得原始的Unix风格退出值。旧版本的VMS版gawk将Unix退出代码0视为1,失败视为2,致命错误视为4,并传递其他所有数字,这违反了VMS退出状态编码要求。VAX/VMS浮点使用无偏舍入。VMS默认以GMT报告时间值,除非设置了
SYS$TIMEZONE_RULE
或
TZ
逻辑名称。较旧版本的VMS(如VAX/VMS 7.3)不会设置这些逻辑名称。使用
-f
选项查找awk程序文件时,默认搜索路径是
"SYS$DISK:[],AWK_LIBRARY:"
。逻辑名称
AWKPATH
可用于覆盖此默认值,其格式是用逗号分隔的目录规范列表。定义时,值应该加引号,以确保它保留单一翻译而不是多翻译的RMS搜索列表。
4. 报告问题和错误
如果你在使用gawk时遇到问题或认为发现了错误,应该向开发者报告。在报告错误之前,要确保你真的发现了一个真正的错误。仔细重读文档,查看是否允许你执行你正在尝试的操作。如果不清楚是否可以执行某项操作,也应该报告,这可能是文档中的错误。
在报告错误或尝试自行修复之前,尝试将问题隔离到最小的awk程序和输入数据文件,以便重现问题。然后向开发者发送程序和数据文件、你使用的Unix系统类型、编译gawk所用的编译器以及gawk给出的准确结果。同时说明你期望发生的情况,这有助于开发者判断问题是否真的出在文档中。
确保包含你使用的gawk版本号,可以使用以下命令获取该信息:
gawk --version
一旦有了精确的问题描述,将电子邮件发送到
bug - gawk@gnu.org
。gawk维护者订阅了这个地址,因此他们会收到你的错误报告。虽然你可以直接向维护者发送邮件,但建议使用错误报告地址,因为该邮件列表会在GNU项目中存档。所有邮件必须使用英语,因为这是所有维护者共同理解的唯一语言。不要尝试通过在Usenet/Internet新闻组
comp.lang.awk
上发布来报告gawk中的错误。gawk开发者偶尔会阅读这个新闻组,但不能保证会看到你的帖子。这里描述的步骤是报告错误的唯一官方认可方式。
综上所述,gawk在不同操作系统上的安装、配置、使用和问题处理都有其特定的方法和注意事项。通过遵循上述步骤和建议,你可以顺利地在各种系统中使用gawk进行数据处理和编程。
超级会员免费看
2127

被折叠的 条评论
为什么被折叠?



