shell脚本的awk中出现错误
我的代码出现以下错误。代码中缺少什么?我的目标是以$version打印13.0.5.8shell脚本的awk中出现错误,shell,awk,grep,Shell,Awk,Grep,我的代码出现以下错误。代码中缺少什么?我的目标是以$version打印13.0.5.8 #!/bin/ksh file="abc_def_APP_13.0.5.8" if echo "$file" | grep -E "abc_def_APP"; then echo "Version found: $file" version1=(echo $file | awk -F_ '{print $NF}' | cut -d. -f1-3) version
#!/bin/ksh
file="abc_def_APP_13.0.5.8"
if echo "$file" | grep -E "abc_def_APP"; then
echo "Version found: $file"
version1=(echo $file | awk -F_ '{print $NF}' | cut -d. -f1-3)
version2=(echo $file | awk -F_ '{print $NF}' | cut -d. -f4-)
echo $version1
echo $version2
version=$version$version2
echo $version
else
echo "Version not found"
fi
请在下面查找错误:
./version.sh: line 7: syntax error near unexpected token `|'
./version.sh: line 7: ` version1=(echo $file | awk -F_ '{print $NF}' | cut -d. -f1-3)'
./version.sh: line 9: syntax error near unexpected token `|'
./version.sh: line 9: ` version2=(echo $file | awk -F_ '{print $NF}' | cut -d. -f4-)'
./version.sh: line 18: syntax error near unexpected token `else'
问题是您的反勾号丢失。
$
您需要这样修复以下两行:
version1=$(echo $file | awk -F_ '{print $NF}' | cut -d. -f1-3)
version2=$(echo $file | awk -F_ '{print $NF}' | cut -d. -f4-)
这将修复语法错误。由于$version
尚未初始化,以下行没有太大意义:
version=$version$version2
你是说:
version="${version1}.${version2}"
旁注:您正在将-E
选项与grep
一起使用,但您没有使用任何扩展的regexp功能,实际上您正在执行固定字符串搜索,因此-F
更合适。您可能还想使用-q
选项来抑制grep
的输出
就我个人而言,我会:
file="abc_def_APP_13.0.5.8"
echo "$file" | awk '/abc_def_APP/{print "Version found: "$0;
print $4,$5,$6;
print $7;
print $4,$5,$6,$7;
next}
{print "Version not found"}' FS='[_.]' OFS=.
如果您只需要变量version
中的版本号,那么为什么不简单地:
version=$(echo "$file" | grep -o '[0-9].*')
根本不需要awk。只需在最后一个下划线之前修剪每个字符,如下所示:
file="abc_def_APP_13.0.5.8"
version="${file##*_}"
echo "$version"
有关此技术的文档,请参阅,或参阅bash自己的文档中的“参数扩展”
单独处理最后一段也很简单:
file="abc_def_APP_13.0.5.8"
version="${file##*_}" # result: 13.0.5.8
version_end="${version##*.}" # result: 8
version_start="${version%.*}" # result: 13.0.5
echo "${version_start}/${version_end}" # result: 13.0.5/8
因为这在bash内部发生,而不执行任何外部命令(如awk),所以它的执行速度应该比给出的其他方法快得多。这一切都可以在单个awk命令中完成,而无需额外的cut命令。考虑以下命令:
read version1 version2 < <(echo $file|awk -F "[_.]" '{
printf("%s.%s.%s ", $4, $5, $6); printf("%s", $7);
for (i=8; i<=NF; i++) printf(".%s", $i); print ""}')
echo "$version1 :: $version2"
这很有效,但我希望我的版本变量的值
13.0.5/8
很抱歉,因为我在一开始的问题中不清楚。我该如何实现它?@sravs448已适当更新。@AdrianFrühwirth为什么这是公认的答案?问题是关于OP看到的错误,答案是backticks中缺少的$
。这是实现同样目标的一个很好的替代方法,但实际上并没有回答这个问题。@sudo_O如果有人问他们为什么不能用筛子装水,最好的答案是告诉他们如何使用水桶,而不是建议他们用粘土塞住筛子。我在另一个文件中有一行,版本号不同。我想在那里替换这个版本号File1:location=“/path/13.2.0/9/application1.war”
如何将13.2.0/9
替换为我们从上述代码中获得的$version1/$version2。我有一个代码来获取文件中的旧版本号<代码>版本=($(grep-r“location=.*war”/path/filename | awk'{print($1)}'| cut-f8--d)/sed's/{1\}$/')这给了我一个旧版本号13.2.0/9的输出,你可以使用这个awk:awk-v v1=$version1-v v2=$version2'BEGIN{{FS=OFS=“/”}$3=v1;$4=v2;$1/path/filename;它可以更改文件中的任何内容。这个awk会用新版本号替换旧版本号吗?是的,它会用新版本号替换旧版本号。您的文件的内容是正确的:location=“/path/13.2.0/9/application1.war
?这是一个包含许多应用程序详细信息的非常大的文件。我想在location=“cc://view/blah/blah/blah/abc_def_APP/13.2.0/9/application1.war”行中替换一个特定应用程序的版本号“
所有应用程序都有自己的版本号。这就是为什么在我上面的awk命令中,我专门为location=.*application1.war做了一个grep,它看起来相当脆弱。你怎么知道abc_def_APP
以后不会是abc_def_foo_APP
呢?我当然不知道。我只知道OP给出的问题中的信息。我的答案是唯一一个指出脚本失败原因的答案,我建议的awk
解决方案只是OP已经拥有的内容的直接翻译,因此与他的原始解决方案一样脆弱。
13.0.5 :: 8