这是 runawk 命令,可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器
程序:
您的姓名
runawk - AWK 解释器的包装器
概要
跑酷 [选项] 程序文件
跑酷 -e 程序
动机
在使用 AWK 进行编程多年后,我发现尽管它简单且
限制 AWK 足以编写各种不同任务的脚本。 AWK 不是
与 Perl、Ruby、TCL 等更大的同行一样强大,但它有他们的
几乎所有类 UNIX 上的紧凑性、简单性和可用性等优点
系统。 我个人也喜欢它的数据驱动性质和代币导向,非常有用
文本处理实用程序的技术。
不幸的是 awk 解释器缺乏一些重要的特性,有时不能像
尽其所能。
我看到的问题(当然是其中一些)
1.
AWK 缺乏对模块的支持。 即使我创建小程序,我也经常想使用
之前创建并已在其他脚本中使用的函数。 也就是说,这真是太好了
将函数组织成所谓的库(模块)。
2.
为了将参数传递给 "#!/usr/bin/awk -f" 脚本(不是 awk 解释器),它是
必须在参数列表前加上 --(两个减号)。 在我看来,这
看起来很糟糕。 这种行为也违反了 POSIX/SUS“实用程序语法指南”。
计费示例:
awk_程序:
#!/usr/bin/awk -f
开始 {
对于 (i=1; i < ARGC; ++i){
printf "ARGV [%d]=%s\n", i, ARGV [i]
}
}
外壳会话:
% awk_program --opt1 --opt2
/usr/bin/awk: 未知选项 --opt1 被忽略
/usr/bin/awk: 未知选项 --opt2 被忽略
% awk_program -- --opt1 --opt2
ARGV [1]=--opt1
ARGV [2]=--opt2
%
在我看来 awk_程序 脚本应该像这样工作
% awk_program --opt1 --opt2
ARGV [1]=--opt1
ARGV [2]=--opt2
%
3.
什么时候 ”#!/usr/bin/awk -f" 脚本处理参数(选项)并希望从中读取
标准输入,有必要明确添加/dev/stdin(或`-')作为最后一个参数。
计费示例:
awk_程序:
#!/usr/bin/awk -f
开始 {
if (ARGV [1] == "--flag"){
标志 = 1
ARGV [1] = "" # 不读取名为 "--flag" 的文件
}
}
{
打印“标志=”标志“$0=”$0
}
外壳会话:
% 回声测试 | awk_program -- --flag
% 回声测试 | awk_program -- --flag /dev/stdin
标志=1 $0=测试
%
理想的情况下 awk_程序 应该像这样工作
% 回声测试 | awk_program --flag
标志=1 $0=测试
%
4.
伊格(1) GNU awk 附带的不能在shebang 中使用。 在大多数(所有?)
UNIXes 脚本以
#!/usr/local/bin/igawk -f
不管用。
跑酷 被创建来解决所有这些问题
配置
-d 打开调试模式。
-e 程序
指定程序。 如果 -e 未指定,从 AWK 代码读取 程序文件.
-f awk_模块
前往激活 awk_模块. 这与
#使用“awk_module.awk”
代码中的指令。 多种的 -f 允许选项。
-F fs 将输入字段分隔符 FS 设置为正则表达式 fs.
-h 显示帮助信息。
-t 如果应用此选项,则会创建一个临时目录 跑酷 以及通往它的道路
被传递给 AWK 子进程。 在下面创建临时目录
${RUNAWK_TMPDIR}(如果已设置),或 ${TMPDIR}(如果已设置)或 / tmp目录 目录
除此以外。 如果 #用 “tmpfile.awk” 在程序中检测到此选项已激活
自动。
-T 将 FS 设置为 TAB 字符。 这相当于 -F'\t'
-V 显示版本信息。
-v VAR=VAL
赋值 VAL 到变量 VAR 在程序开始执行之前。
细节/内部
独立 脚本
在类 UNIX 操作系统下,您可以使用 跑酷 通过开始你的脚本
#!/usr/local/bin/runawk
线或类似的东西而不是
#!/usr/bin/awk -f
或类似的。
AWK 模块
为了激活模块,您应该像这样将它们添加到 awk 脚本中
#使用“module1.awk”
#使用“module2.awk”
即指定模块名称的行被普通 AWK 视为注释行
解释器,但由 跑酷 尤其。
除非你跑 跑酷 带选项 -e, #用 必须从第 0 列开始,即没有空格或
在它之前允许使用制表符,并且在它之间不允许使用任何符号 # 和 使用.
另请注意,AWK 模块也可以“使用”其他模块等等。 他们都是
以深度优先的顺序收集,每个都添加到 awk 解释器列表中
带有 -f 选项的参数。 那是 #用 指令*不*类似于 的#include
在 C 语言中,runawk 的模块代码没有插入到 #用.
Runawk 的模块更接近 Perl 的“use”命令。 如果提到某个模块
不止一次,只会为其添加一个 -f,即删除重复项
自动。
的立场 #用 源文件中的指令确实很重要,即较早的模块是
前面提到过,将为其生成较早的 -f。
计费示例:
文件编:
#!/usr/local/bin/runawk
#使用“A.awk”
#使用“B.awk”
#使用“E.awk”
程序代码
...
文件 B.awk:
#使用“A.awk”
#使用“C.awk”
B码
...
文件 C.awk:
#使用“A.awk”
#使用“D.awk”
代码
...
A.awk 和 D.awk 不包含 #use 指令
如果你跑步
runawk prog 文件 1 文件 2
or
/path/to/prog 文件 1 文件 2
以下命令
awk -f A.awk -f D.awk -f C.awk -f B.awk -f E.awk -f prog -- file1 file2
实际上会运行。
您可以通过运行来检查这一点
runawk -d prog 文件1 文件2
模块 搜索、 策略
首先在主程序所在的目录中搜索模块(或#use所在的模块
指令被指定)被放置。 如果在那里没有找到,那么 AWKPATH 环境
变量被检查。 AWKPATH 保留一个以冒号分隔的搜索目录列表。 最后,
在系统 runawk 模块目录中搜索模块,默认为 PREFIX/share/runawk 但
这可以在编译时更改。
也可以指定模块的绝对路径。
教学计划 as an 论点
像其他一些口译员一样 跑酷 可以像这样从命令行获取脚本
/path/to/runawk -e '
#使用“alt_assert.awk”
{
assert($1 >= 0 && $1 <= 10, "错误值:" $1)
#你的代码在下面
...
}'
跑酷 也可用于编写oneliners
runawk -f abs.awk -e 'BEGIN {print abs(-1)}'
选择 a 首选 AWK 翻译员
出于某种原因,您可能更喜欢一个 AWK 口译员或另一个。 原因可能是
特定任务的效率,有用但不是标准扩展或其他任何东西。 到
展示 跑酷 用什么AWK解释器,可以用 #interp 指示
文件编:
#!/usr/local/bin/runawk
#使用“A.awk”
#使用“B.awk”
#interp "/usr/pkg/bin/nbawk"
# 你的代码在这里
...
需要注意的是 #interp 指令也应该从第 0 列开始,之前不允许有空格
它和之间 # 和 插曲.
有时让用户能够选择他们喜欢的 AWK 也是有意义的
解释器而不更改源代码。 在 跑酷 可以使用特殊的
指示 #interp-var 它设置了一个可由用户分配的环境变量名称
指定一个 AWK 解释器。 例如,下面的脚本
文件栏:
#!/usr/bin/环境 跑酷
#interp-var "FOOBAR_AWK"
开始 {
打印“这是一个 FooBar 应用程序”
}
可以作为
env FOOBAR_AWK=mawk foobar
或者只是
foobar
在前一种情况下 毛克 将用作 AWK 解释器,在后者中——默认 AWK
口译员。
运用 现有 模块 仅由
在 UNIX 世界中,通常的做法是用编程语言编写配置文件
的应用程序。 也就是说,如果应用程序是用 Bourne shell 编写的,那么配置
此类应用程序的文件通常也用 Bourne 编写。 使用 RunAWK 可以做到
用 AWK 编写的应用程序也是如此。 例如,下面的代码将使用
~/.foobarrc 文件,如果它存在,否则 /etc/foobar.conf 将被使用,如果它存在。
文件栏:
#!/usr/bin/环境 跑酷
#安全使用“~/.foobarrc" "/etc/foobar.conf"
开始 {
打印 foo、bar、baz
}
文件 ~/.foobarrc:
开始 {
foo = "foo10"
bar = "bar20"
巴兹 = 123
}
当然可以, #安全使用 指令也可用于其他目的。 #安全使用
指令接受尽可能多的模块,但最多可以使用 awk 包含一个
选项-f,其他的被默默忽略,还要注意模块是从左到右分析的
对。 模块名称中的前导波浪号替换为用户的主目录。 其他
例:
文件栏:
#!/usr/bin/环境 跑酷
#use "/usr/share/foobar/default.conf"
#安全使用“~/.foobarrc" "/etc/foobar.conf"
你的代码在这里
这里默认设置在/usr/share/foobar/default.conf中,配置
文件(如果有)用于覆盖它们。
设置 环境
在某些情况下,您可能希望在特定环境中运行 AWK 解释器。 为了
例如,您的脚本可能只面向处理 ASCII 文本。 在这种情况下,您可以运行
具有 LC_CTYPE=C 环境的 AWK 并使用正则表达式范围。
跑酷 提供 #环境 指令。 双引号内的字符串被传递给
普腾女(3)libc函数。
计费示例:
文件编:
#!/usr/local/bin/runawk
#env "LC_ALL=C"
$1 ~ /^[AZ]+$/ { # 如果 LC_CTYPE=C AZ 有效
打印 $1
}
退出 状态
如果AWK解释器正常退出, 跑酷 以其退出状态退出。 如果 AWK 解释器
被信号杀死, 跑酷 以退出状态 128+ 信号退出。
环境
路径
冒号分隔的目录列表,其中 AWK 模块被搜索。
RUNAWK_AWKPROG
设置AWK解释器的路径,默认使用,即这个变量覆盖
编译时默认值。 请注意,#interp 指令会覆盖这一点。
RUNAWK_KEEPTMP
如果设置,则不会删除临时文件。
使用 onworks.net 服务在线使用 runawk