awk 是否也可以将字段标识符用于 shell 字符串(变量)?

syn*_*ror 3 shell awk string variable

嗯,这显然是不可能的,我正在尝试它。

但是,这种获取bar作为结果字符串的替代方法有效:

#!/bin/bash

path1=/usr/tmp/foo/bar/baz

awk -F/ '{print $5}' <<< "$path1"
Run Code Online (Sandbox Code Playgroud)

到目前为止一切顺利,但是如果我想没有<<<操作员以及那些臭名昭著的echo | ...管道怎么办?简而言之,我想要做的是将指令path1作为变量传递,使用字段分隔符和字段标识符(例如)来解析-内部变量,该变量从外部shell 变量中分配了其值。这也可以在“内部”完成吗?-v pa="$path1"-F/$5awk pa path1awk

Sté*_*las 7

-v选项或var=value参数的问题awk在于它们不能用于任意数据,因为 ANSI C 转义序列(如\n, \b...)在其中展开(并且在 GNU awk4.2 或更高版本中,如果值以@/并以 结尾/,它被视为正则表达式类型的变量)。

另一种方法是使用ARGVorENVIRON awk数组:

awk -F / 'BEGIN{$0 = ARGV[1]; print $5}' "$path1"
Run Code Online (Sandbox Code Playgroud)

或者:

export path1
awk -F / 'BEGIN{$0 = ENVIRON["path1"]; print $5}'
Run Code Online (Sandbox Code Playgroud)

或者:

path1="$path1" awk -F / 'BEGIN{$0 = ENVIRON["path1"]; print $5}'
Run Code Online (Sandbox Code Playgroud)

现在,如果你想要的只是拆分一个 shell 变量,你可能不需要awk.

在所有 POSIX shell 中:

IFS=/; set -f
set -- $path1
printf '%s\n' "$5"
Run Code Online (Sandbox Code Playgroud)

  • @syntaxerror,然后查看第三个变体,或使用 ARGV。如果只有 BEGIN 部​​分,则不会读取文件或标准输入。 (2认同)