我有这个命令:
Folder=./GAS/NNN_/Neutral
awk -F / '{print $(NF-1)}' $Folder
但我得到了:awk: read error (Is a directory)
我努力了:
awk -F / '{print $(NF-1)}' $(Folder)
awk -F / '{print $(NF-1)}' $($Folder)
awk -F / '{print $(NF-1)}' $(echo $Folder)
我得到了同样的答复。
答案1
awk 的语法是 或awk 'awk script' input_file
。input_stream | awk 'awk script'
您尝试将变量作为文件名传递,并且由于变量的值是目录,因此 awk 尝试将该目录作为文件打开并失败。
因此,您要么需要打印出该值,然后将其传递给awk
(参见为什么 printf 比 echo 更好?我在这里使用的原因printf
):
$ printf '%s\n' "$Folder" | awk -F / '{print $(NF-1)}'
NNN_
或者你可以使用这里是字符串:
$ awk -F / '{print $(NF-1)}' <<< "$Folder"
NNN_
答案2
使用任何 awk:
awk -F / 'BEGIN{ print a[split(ARGV[1],a)-1]; exit }' "$Folder"
将参数拆分为 awk 而不是将输入拆分为 awk 将避免对其他命令、管道和/或临时文件(例如<<<
可能会创建的)的需求。
仅供参考,您不需要 awk 或任何其他外部命令来实现此目的,例如使用 bash 您可以执行以下任一操作或类似操作:
tmpStr="${Folder%/*}"; printf '%s\n' "${tmpStr##*/}"
[[ $Folder =~ .*/([^/]*)/ ]] && printf '%s\n' "${BASH_REMATCH[1]}"
IFS=/ read -ra tmpArr <<< "$Folder"; printf '%s\n' "${tmpArr[-2]}"
( set -f; IFS=/; tmpArr=( $Folder ); printf '%s\n' "${tmpArr[-2]}" )
我将最后一个放在子 shell 中,这样您就不必记住您的set [-+]f
和/或IFS
设置以便在执行命令后恢复它们,但您也可以假设您有set +f
(默认)并在当前 shell 中执行此操作(如果您愿意,可以将其全部放在一行上):
set -f; oIFS="$IFS"; IFS='/';
tmpArr=( $Folder ); printf '%s\n' "${tmpArr[-2]}";
IFS="$oIFS"; set +f