Cal*_*leb 45
从AWK手册页:
system(cmd)
executes cmd and returns its exit status
GNU AWK 手册还有一个部分,部分描述了该system功能并提供了一个示例:
system("date | mail -s 'awk run done' root")
Run Code Online (Sandbox Code Playgroud)
Bar*_*mar 24
有几种方法.
awk有一个system()运行shell命令的函数:
system("cmd")
你可以打印到管道:
print "blah" | "cmd"
您可以拥有awk构造命令,并将所有输出传递给shell:
awk 'some script' | sh
一种更健壮的方法是使用getline()GNU函数awk来使用管道中的变量。以cmd | getline结果形式cmd运行,然后将其输出通过管道传递到getline。1如果失败,0则返回是否有输出,如果是EOF,则返回-1。
BEGIN如果命令不依赖于文件的内容(例如,简单date或),则首先构造要在子句中的变量中运行的命令ls。
上面的一个简单示例是
awk 'BEGIN {
cmd = "ls -lrth"
while ( ( cmd | getline result ) > 0 ) {
print result
}
close(cmd);
}'
Run Code Online (Sandbox Code Playgroud)
当要运行的命令是文件的列式内容的一部分时,您将cmd在主目录中生成字符串,{..}如下所示。例如,考虑一个文件,$2其中包含文件名,并且您希望将其替换md5sum为文件的哈希内容。你可以做
awk '{ cmd = "md5sum "$2
while ( ( cmd | getline md5result ) > 0 ) {
$2 = md5result
}
close(cmd);
}1'
Run Code Online (Sandbox Code Playgroud)
涉及外部命令的另一种常见用法awk是在date处理过程中,当您awk不支持带有的功能时mktime(),strftime()功能。
考虑一种情况,当您将Unix EPOCH时间戳存储在一列中并且想要将其转换为人类可读的日期格式时。假设GNU date可用
awk '{ cmd = "date -d @" $1 " +\"%d-%m-%Y %H:%M:%S\""
while ( ( cmd | getline fmtDate) > 0 ) {
$1 = fmtDate
}
close(cmd);
}1'
Run Code Online (Sandbox Code Playgroud)
输入字符串为
1572608319 foo bar zoo
Run Code Online (Sandbox Code Playgroud)
上面的命令产生的输出为
01-11-2019 07:38:39 foo bar zoo
Run Code Online (Sandbox Code Playgroud)
可以定制该命令以修改date给定行中任何列上的字段。请注意,这-d是GNU特定的扩展,* BSD变体支持-f(尽管与并不完全相似-d)。
像这样简单的东西会起作用
awk 'BEGIN{system("echo hello")}'
Run Code Online (Sandbox Code Playgroud)
和
awk 'BEGIN { system("date"); close("date")}'
我使用 awk 的强大功能来删除一些已停止的 docker 容器。仔细观察我如何cmd在将字符串传递给system.
docker ps -a | awk '$3 ~ "/bin/clish" { cmd="docker rm "$1;system(cmd)}'
在这里,我使用具有模式“/bin/clish”的第三列,然后提取第一列中的容器 ID 来构造我的cmd字符串并将其传递给system.