shell脚本的awk中出现错误

shell脚本的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

我的代码出现以下错误。代码中缺少什么?我的目标是以$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)

    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